我获得了这个代码片段,它尝试通过对象的vptr (指向虚拟函数表)调用虚拟函数,并使用对象指针将其转换为p->vptr,如下所示:
#include<iostream>
using namespace std;
struct C {
virtual int f() {
return 7;
}
};
typedef int (*pf)();
int main() {
C c1;
pf *pvtable = (pf *) &c1;
cout << (*pvtable[0])() << endl;
return 0;
}我使用clang++14编译/链接。在运行它时,程序返回139,并且没有显示cout行,似乎它已经崩溃了。
为什么它不能工作,以及如何修复它?
发布于 2022-09-20 16:28:52
为什么它不起作用
您正在将指向C的指针转换为指针到int(*)().
此转换在C++语言中没有任何意义,并且使用结果指针是显式的未定义行为。
和如何修复它?
没有可靠的方法。
C++并不保证在任何程序中都存在一个vtable指针,如果有一个,C++也不会提供任何方法来访问它。
https://stackoverflow.com/questions/73789167
复制相似问题