-1
我已写编码和用于它函数指针,如波纹管编码:C++:分段故障
#include <iostream>
using namespace std;
//base class
class Base1 {
public:
virtual void f() { cout << "Base1::f" << endl; }// virtual function
virtual void g() { cout << "Base1::g" << endl; }// virtual function
virtual void h() { cout << "Base1::h" << endl; }// virtual function
};
class Derive : public Base1 {
public:
virtual void f() { cout << "Derive::f" << endl; }// virtual function
virtual void g1() { cout << "Derive::g1" << endl; }
};
typedef void(*Fun)(void);
int main()
{
Fun pFun = NULL;
Derive d;
int** pVtab = (int**)&d;
//Base1's vtable
//pFun = (Fun)*((int*)*(int*)((int*)&d+0)+0);
pFun = (Fun)pVtab[0][0];
pFun();
//pFun = (Fun)*((int*)*(int*)((int*)&d+0)+1);
pFun = (Fun)pVtab[0][1];
pFun();
return 0;
}
但是,当我运行克++在Linux中的代码,它示出了:
Derive::f
Segmentation fault
我想知道为什么以及如何解决它。
是什么让你觉得vtable在那里? –
@JonathanPotter我读过一些书,并告诉我! –
此代码将不可移植。尝试自己进入VMT是一个糟糕的主意。如果你需要一个指向方法的指针,而不是做一些花哨的事情,比如试图通过访问VMT来获取指向函数的指针。 –