多继承(含虚函数覆盖)vftb中虚函数排列
来源:互联网 发布:linux查询ip 编辑:程序博客网 时间:2024/05/18 02:43
#include <iostream>#include <string>#include <vector>#include <cctype>using namespace std;//多继承(有虚函数覆盖)//1) 每个父类都有自己的虚表,有多少个父类就有多少个虚指针//2) 子类的所有虚函数地址被放到了第一个父类的虚函数表中(排列顺序:先基类虚函数地址后子类虚函数地址,若覆盖了第一个父类中的虚函数, 则地址变为派生类override的虚函数地址;若没有覆盖,则仍未原父类虚函数地址)。(所谓的第一个父类是按照声明顺序来判断的)//3) 若子类override了第二个及其之后的基类的虚函数,则在第二个vftp及之后的 vftp所对应的虚函数表中更改派生类override的虚函数地址。//图片中红色标出的虚函数为派生类新增的,放在第一个虚函数表尾部;蓝色标出的为派生类覆盖基类的虚函数 class Base1{public:int x1;virtual void f1(){cout << "Base1::f" << endl;}virtual void g1(){cout << "Base1::g" << endl;}};class Base2{public:int x2;virtual void f2(){cout << "Base2::f" << endl;}virtual void g2(){cout << "Base2::g" << endl;}};class Base3{public:int x3;virtual void f3(){cout << "Base3::f" << endl;}virtual void g3(){cout << "Base3::g" << endl;}};class Derive:public Base1,public Base2,public Base3{public:int y;virtual void f(){cout << "Derive::f" << endl;} //新增fvirtual void g1(){cout << "Derive::g1" << endl;} //覆盖Base1的g1//virtual void f2(){cout << "Derive::f2" << endl;} //覆盖Base2的f2virtual void g3(){cout << "Derive::g3" << endl;} //覆盖Base3的g3virtual void myfun1(){cout << "Derive::myfun1" << endl;} //新增myfun1virtual void myfun2(){cout << "Derive::myfun2" << endl;} //新增myfun2};typedef void (*Fun)();int main(){Fun pFun;Derive derive;Derive *de = &derive;//通过获取private虚函数指针,如下((Fun)((*q)[3]))实现访问!void*** q1 = (void***)&derive; cout<<*q1<<endl; // Base1Subobj 的 vptr,即指向Base1的虚函数表;cout<<**q1<<endl; // 没有覆盖,指向Base1的f1虚函数cout<<*(*q1+1)<<endl; // 覆盖基类g1,指向Derive的g1虚函数cout<<*(*q1+2)<<endl; // 指向Derive新增的f虚函数cout<<*(*q1+3)<<endl; // 指向Derive新增的myfun1虚函数cout<<*(*q1+4)<<endl; // 指向Derive新增的myfun2虚函数pFun = (Fun)(**q1); //pFun为指向Base1::f1()的指针pFun();pFun = (Fun)(*(*q1+1)); //pFun为指向Derive::g1()的指针pFun();pFun = (Fun)(*(*q1+2)); //pFun为指向Derive::f()的指针pFun();pFun = (Fun)(*(*q1+3)); //pFun为指向Derive::myfun1的指针pFun();pFun = (Fun)(*(*q1+4)); //pFun为指向Derive::myfun2的指针pFun();system("pause");return 0;}
0 0
- 多继承(含虚函数覆盖)vftb中虚函数排列
- 多继承无虚函数覆盖下的vftb排列
- 单一继承下虚函数覆盖时vftb的排列
- C++继承:同名隐藏、覆盖,虚函数
- C++继承:同名隐藏、覆盖,虚函数
- C++继承:同名隐藏、覆盖,虚函数
- C++继承:同名隐藏、覆盖,虚函数
- 从虚函数的内存构造谈C++继承中函数的覆盖与隐藏
- java--继承中函数覆盖图解
- 继承中的函数覆盖
- 继承与多态---上 --- 函数重写、多态、虚函数、覆盖、隐藏
- (1.4.1)虚继承、虚函数继承、多重继承和“含对象成员类的构造顺序”
- C++ 虚函数;重载与覆盖;虚继承
- (25)继承中成员变量、函数中覆盖、构造函数的理解
- c++ 继承 虚函数与多态性 重载 覆盖 隐藏
- c++(一) 类 对象 重载 继承 多态 构造函数 虚函数 覆盖 纯虚函数等
- 单一继承下无虚函数覆盖__虚函数表中的虚函数指针的获取
- 单一继承下无虚函数覆盖__虚函数表中的虚函数指针的获取(二)
- exception in thread "main" brut.androlib.AndrdolibException: Counld not decode arse file
- 4.疯狂指针-壹
- 读书笔记---arm-linux-objcopy命令解析
- 多线程14__Java同步代码块,同步方法
- C和指针读书笔记-第10章(结构和联合)
- 多继承(含虚函数覆盖)vftb中虚函数排列
- 用Python和Pygame写游戏-从入门到精通(5)
- git解决冲突与merge
- cocos2d创建带有背景颜色的layer
- 天津网站建设-SEO
- 解题报告 之 POJ2699 The Maximum Number of Strong Kings
- 【Python】豆瓣FM API分析
- Android开发——Activity间的值传递
- 遗留代码