class CStu
{
virtual void go1()
{
std::cout << "go1" << std::endl;
}
virtual void go2()
{
std::cout << "go2" << std::endl;
}
virtual void go3()
{
std::cout << "go3" << std::endl;
}
};
int main()
{
CStu *p = new CStu;
// p指針裏面存放的數據是虛函數表的二級指針
//*(int *)p p佔4個字節,強轉成int * 後 解引用,取出二級指針地址
//(int **)(*(int *)p)將二級指針地址由void **轉爲 int **
//(int **)(*(int *)p) + n 相當於(int **)(*(int *)p)[n],取出裏面的元素指針
// *((int **)(*(int *)p) + n) 解該引用,取出指針裏面存放的地址
//(void *)(*((int **)(*(int *)p) + n))將取出的地址值強轉爲void* 型,
//外面賦值給函數指針,即可調用類裏面的虛函數。
std::cout << *(int *)p << std::endl;
std::cout << *((int **)(*(int *)p) + 0) << std::endl;
std::cout << *((int **)(*(int *)p) + 1) << std::endl;
std::cout << *((int **)(*(int *)p) + 2) << std::endl;
typedef void (*fun)();
for (int i = 0; i < 3; i++)
{
fun f1 = (fun)((void *)(*((int **)(*(int *)p) + i)));
f1();
}
return 0;
}