2016-03-05 173 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)的與第一聲明的函數對齊,並期望它對齊帶功能。這是不太可能的。