2016-03-05 122 views
-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 

我想知道为什么以及如何解决它。

+0

是什么让你觉得vtable在那里? –

+0

@JonathanPotter我读过一些书,并告诉我! –

+0

此代码将不可移植。尝试自己进入VMT是一个糟糕的主意。如果你需要一个指向方法的指针,而不是做一些花哨的事情,比如试图通过访问VMT来获取指向函数的指针。 –

回答

1
pFun = (Fun)pVtab[0][0]; 
pFun(); 

只要发生在派生类

//pFun = (Fun)*((int*)*(int*)((int*)&d+0)+1); 
pFun = (Fun)pVtab[0][1]; 
pFun(); 

现在你抵消了指针由派生的sizeof(* INT)的与第一声明的函数对齐,并期望它对齐带功能。这是不太可能的。