探索多态模型—菱形继承和菱形虚拟继承
来源:互联网 发布:网络不知名的女歌手 编辑:程序博客网 时间:2024/06/05 07:54
菱形继承
类AA被类BB和类CC重复继承:
class AA{public: virtual void a(){ cout << "AA::a()" << endl; } virtual void a1(){ cout << "AA::a1()" << endl; }public: int _a;};class BB : public AA{public: virtual void a(){ cout << "BB::a()" << endl; } virtual void a2(){ cout << "BB::a2()" << endl; } virtual void a3(){ cout << "BB::a3()" << endl; }public: int _b;};class CC : public AA{public: virtual void a(){ cout << "CC::a()" << endl; } virtual void a1(){ cout << "CC::a1()" << endl; } virtual void a4(){ cout << "CC::a4()" << endl; }public: int _c;};class DD : public BB , public CC{public: virtual void a(){ cout << "DD::a()" << endl; } virtual void a2(){ cout << "DD::a2()" << endl; } virtual void a3(){ cout << "DD::a3()" << endl; } virtual void a5(){ cout << "DD::a5()" << endl; }public: int _d;};typedef void(*FUNC) ();void Print(int *Vfptr){ cout << "虚表地址" << Vfptr << endl; for (int i = 0; Vfptr[i] != 0; ++i) { FUNC f = (FUNC)Vfptr[i]; cout << "[" << i << "]" << endl; f(); } cout << endl;}int main(){ DD d; int *Vfptr1 = (int*)(*(int*)&d); int *Vfptr2 = (int*)(*((int*)&d+sizeof(BB)/4)); Print(Vfptr1); Print(Vfptr2); system("pause"); return 0;}
虚表的结果:
菱形继承总结:
会出现数据冗余和二义性问题
派生类会分别继承每个基类的虚函数表,并将自己的虚函数放在第一个虚函数表中
成员变量的顺序按照继承的关系排列
菱形虚拟继承
虚继承就是在类BB和类CC继承的时候加上virtual关键字
class AA{public: virtual void a(){ cout << "AA::a()" << endl; } virtual void a1(){ cout << "AA::a1()" << endl; }public: int _a;};class BB : virtual public AA{public: virtual void a(){ cout << "BB::a()" << endl; } virtual void a2(){ cout << "BB::a2()" << endl; } virtual void a3(){ cout << "BB::a3()" << endl; }public: int _b;};class CC : virtual public AA{public: virtual void a(){ cout << "CC::a()" << endl; } virtual void a1(){ cout << "CC::a1()" << endl; } virtual void a4(){ cout << "CC::a4()" << endl; }public: int _c;};class DD : public BB , public CC{public: virtual void a(){ cout << "DD::a()" << endl; } virtual void a2(){ cout << "DD::a2()" << endl; } virtual void a3(){ cout << "DD::a3()" << endl; } virtual void a5(){ cout << "DD::a5()" << endl; }public: int _d;};typedef void(*FUNC) ();void Print(int *Vfptr){ cout << "虚表地址" << Vfptr << endl; for (int i = 0; Vfptr[i] != 0; ++i) { FUNC f = (FUNC)Vfptr[i]; cout << "[" << i << "]" << endl; f(); } cout << endl;}int main(){ DD d; int *Vfptr1 = (int*)(*(int*)&d); int *Vfptr2 = (int*)(*(int*)((char*)&d+sizeof(DD)-sizeof(AA))); int *Vfptr3 = (int*)(*((int*)((char*)&d + sizeof(BB)-sizeof(AA)))); Print(Vfptr1); Print(Vfptr2); Print(Vfptr3); system("pause"); return 0;}
注:当类BB,类CC都对类AA中的虚函数a()进行覆盖,会编译出错,出现二义性问题。这时类DD需要对虚函数a()进行重写,才可避免。
阅读全文
0 0
- 探索多态模型—菱形继承和菱形虚拟继承
- 菱形继承和菱形虚拟继承探索
- 【c++】菱形虚拟虚拟继承模型探索
- c++多态对象模型:菱形继承和菱形虚拟继承
- 菱形虚拟继承和多态
- C++菱形继承和菱形虚拟继承
- 菱形继承&菱形虚拟继承
- 菱形继承&菱形虚拟继承
- 菱形继承--菱形虚拟继承
- 《C++多态的对象模型之单/多继承、菱形/菱形虚拟继承》
- 研究菱形虚拟继承和虚表(探索多态的原理)
- 研究虚表(探索多态的原理)和菱形虚拟继承
- 研究虚表(探索多态的原理)和菱形虚拟继承
- 研究虚表(探索多态的原理)和菱形虚拟继承
- 菱形继承与虚拟菱形继承对象模型
- 继承、多继承、菱形虚拟继承
- 继承*菱形继承与菱形虚拟继承
- C++中的多态、单继承、多继承、菱形继承、菱形虚拟继承
- css
- VLD(Visual LeakDetector)内存泄露库的使用
- 反编译apk
- 【HDU 2612 Find a Way(BFS)】(兼BFS入门笔记)
- 因为这理由面试被拒,我不服!
- 探索多态模型—菱形继承和菱形虚拟继承
- builder设计模式
- quartz
- springboot(三):Spring boot中Redis的使用
- 因特网、万维网、互联网区别
- sublime快捷健
- 帧动画
- 分答项目_知识点:阅读七牛存储官网文档的说明
- ONVIF协议网络摄像机(IPC)客户端程序开发(2):第一次使用IPC摄像头