单一继承下无虚函数覆盖__虚函数表中的虚函数指针的获取
2015-04-24 17:36
253 查看
#include <iostream> #include <string> #include <vector> #include <cctype> using namespace std; //单一继承下无虚函数覆盖 //派生类只有一个虚函数表,派生类对象只有一个虚指针来指向这个虚函数表。虚函数表中按照基类虚函数、派生类新增的虚函数顺序依次排列。 //要注意的是一旦将指针p转换成void*(或void**)时,*p(或**p会由于编译器不知道指向内存大小而出错),中间这里采用的是转换为int型; //最后得到函数指针时,要强制转换为 虚函数指针的类型才能得到正确值 class Base { public: int x; virtual void f(){cout << "Base::f" << endl;} virtual void g(){cout << "Base::g" << endl;} virtual void h(){cout << "Base::h" << endl;} }; class Derive:public Base { public: int y; virtual void ff(){cout << "Derive::ff" << endl;} virtual void gg(){cout << "Derive::gg" << endl;} virtual void hh(){cout << "Derive::hh" << endl;} }; //定义函数指针<span style="color:#FF0000;">变量</span>testFun // void (*testFun)(); //定义函数指针<span style="color:#FF0000;">类型</span> typedef void (*Fun)(); int main() { Base base; void** p = (void**)&base; Fun pFun = NULL; cout << "base对象地址:" << (&base) << endl; cout << "base对象中存放虚指针单元的内存地址:" << (void*)(&base) << endl; cout << "虚函数表的地址,即vptr指针的值:" <<(int*)*(int*)(&base) << endl; cout << "虚函数表中第1个虚函数的地址:" <<(Fun)*(int*)*(int*)(&base) << endl; // 虚函数表中存放的是指向虚函数的指针,因此必须转换成虚函数指针类型,而Fun为函数指针类型 cout << "虚函数表中第1个虚函数的地址:" <<(void*)*(int*)*(int*)(&base) << endl; cout << "虚函数表中第2个虚函数的地址:" <<(Fun)*((int*)*(int*)(&base)+1)<< endl; cout << "虚函数表中第3个虚函数的地址:" <<(Fun)*((int*)*(int*)(&base)+2)<< endl; cout<<p<<endl; // base对象地址; cout<<*p<<endl; // 虚函数表的地址 //cout<<**p<<endl; //不能直接输出**p,**p类型为void,此时编译器不知道如何解释地址中内存大小和内容,需转换类型 cout<<(Fun)(*(int*)(*p))<<endl; cout<<(Fun)(*((int*)(*p)+1))<<endl; cout<<(Fun)(*((int*)(*p)+2))<<endl; //利用上述函数指针调用相关函数,两种使用方式均可 pFun = (Fun)(*(int*)(*p)); pFun(); //调用方式1 (*pFun)(); //调用方式2 pFun = (Fun)(*((int*)(*p)+1)); pFun(); pFun = (Fun)(*((int*)(*p)+2)); pFun(); Derive derive; void** q = (void**)&derive; cout << "derive对象地址:" << (&derive) << endl; cout << "derive对象中存放虚指针单元的内存地址:" << (int*)(&derive) << endl; cout << "虚函数表的地址,即vptr指针的值:" <<(int*)*(int*)(&derive) << endl; cout << "虚函数表中第1个虚函数的地址:" <<(Fun)*(int*)*(int*)(&derive)<< endl; cout << "虚函数表中第2个虚函数的地址:" <<(Fun)*((int*)*(int*)(&derive)+1)<< endl; cout << "虚函数表中第3个虚函数的地址:" <<(Fun)*((int*)*(int*)(&derive)+2)<< endl; //下面derive类专属的3个虚函数局部变量在VS中跟踪不到,只能显示上面3个 cout<<"derive新增的虚函数地址如下:\n"; cout << "虚函数表中第4个虚函数的地址:" <<(Fun)*((int*)*(int*)(&derive)+3)<< endl; cout << "虚函数表中第5个虚函数的地址:" <<(Fun)*((int*)*(int*)(&derive)+4)<< endl; cout << "虚函数表中第6个虚函数的地址:" <<(Fun)*((int*)*(int*)(&derive)+5)<< endl; cout<<q<<endl; cout<<*q<<endl; // 虚函数表的地址 cout<<(Fun)(*(int*)(*q))<<endl; cout<<(Fun)(*((int*)(*q)+1))<<endl; cout<<(Fun)(*((int*)(*q)+2))<<endl; cout<<(Fun)(*((int*)(*q)+3))<<endl; cout<<(Fun)(*((int*)(*q)+4))<<endl; cout<<(Fun)(*((int*)(*q)+5))<<endl; //利用上述函数指针调用相关函数 testFun = (Fun)(*(int*)(*q)); testFun(); (*testFun)(); pFun = (Fun)(*((int*)(*q)+1)); pFun(); pFun = (Fun)(*((int*)(*q)+2)); pFun(); // 下面三个函数调用derive的增加的虚函数,说明新增加的虚函数的地址是存在于虚函数表中的,只是没有显示出来。 pFun = (Fun)(*((int*)(*q)+3)); pFun(); pFun = (Fun)(*((int*)(*q)+4)); pFun(); pFun = (Fun)(*((int*)(*q)+5)); pFun(); system("pause"); return 0; }
相关文章推荐
- 单一继承下无虚函数覆盖__虚函数表中的虚函数指针的获取(二)
- 单一继承下虚函数覆盖时vftb的排列
- 获取C++类中的虚函数表的指针和虚函数表中函数的指针
- 单继承与多继承中的虚函数表和虚函数指针
- C++虚函数多继承的虚函数表指针的测试
- 虚函数继承(虚函数指针与虚函数表)
- ◆ C++中通过溢出覆盖虚函数指针列表执行代码
- B继承自A,A指针无法隐式转换为B指针,函数参数只管指针类型,与实际指向对象无关
- 虚函数与多态性,虚拟继承,纯虚函数及重载、覆盖、隐藏的区别
- VS2010中CMainFrame::OnCreate()函数里用GetMenu()无法获取菜单指针
- 获取成员函数的指针
- IMP获取函数指针
- C++多重继承中对函数指针的调整--语言扩充之调整
- C++多态篇2——虚函数表详解之从内存布局看函数重载,函数覆盖,函数隐藏
- 多层继承当中构造函数对虚函数表指针的初始化
- C语言ftell()函数:获取文件读写指针的当前位置
- 根据函数指针地址获取函数名
- 虚函数表获取的函数地址和函数实际地址一样吗?
- 虚函数总结(二) 多重继承的虚函数表
- c++继承中的函数覆盖规则