C++ 通過虛函數表,直接外部訪問類中的函數,並且脫離類

#include
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章