单一继承下无虚函数覆盖__虚函数表中的虚函数指针的获取
来源:互联网 发布:淘宝网上有云克药卖吗? 编辑:程序博客网 时间:2024/06/05 00:30
#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;}
0 0
- 单一继承下无虚函数覆盖__虚函数表中的虚函数指针的获取
- 单一继承下无虚函数覆盖__虚函数表中的虚函数指针的获取(二)
- 单一继承下虚函数覆盖时vftb的排列
- C++ 虚函数 单一继承 多重继承 单一虚继承 菱形虚继承 的简洁总结
- 继承中的函数覆盖
- 单一继承下基类private虚函数
- 获取C++类中的虚函数表的指针和虚函数表中函数的指针
- 单继承与多继承中的虚函数表和虚函数指针
- 获取虚函数表指针
- 获取虚函数指针
- 虚函数表指针和虚继承
- C++继承:同名隐藏、覆盖,虚函数
- C++继承:同名隐藏、覆盖,虚函数
- C++继承:同名隐藏、覆盖,虚函数
- C++继承:同名隐藏、覆盖,虚函数
- 曾经的笔记迁移__函数指针
- 通过函数指针使用虚函数表中的函数
- 多继承无虚函数覆盖下的vftb排列
- 黑盒测试和白盒测试http://www.uml.org.cn/Test/200711214.asp
- Longest Palindromic Substring
- 一种区分语言环境的 String 比较方法
- MFC 消息(缺自定义消息)
- make oldconfig /config /defconfig /menuconfig
- 单一继承下无虚函数覆盖__虚函数表中的虚函数指针的获取
- 模块的写法
- 我的IOS库-任意颜色渐变的圆环
- ListView Notes
- jsoncpp Json::Value 成员变量/全局变量析构时引起崩溃问题解决
- 7.PMAC下位机-回零程序的编写
- MFC消息映射梳理
- svn提交设置
- MFC 三种消息