C++ 虚表(探索多态的原理)和菱形继承
来源:互联网 发布:万得股票mac版 编辑:程序博客网 时间:2024/05/19 15:18
虚表(探索多态原理)和菱形继承
菱形继承(多继承): 两个子类继承同一个父类,而又有子类 同时继承这两个子类。
菱形继承关系模型如下图:
菱形继承的代码如下:DD的对象中有两个AA成员
#include<iostream>#include<stdlib.h>using namespace std;class AA{ public: int _aa;};class BB:public AA{ public: int _bb;};class CC:public AA{ public: int _cc;};class DD:public BB, public CC{ public: int _dd;};int main(){ AA a; BB b; CC c; DD d;// d.aa = 0; cout<<sizeof(a)<<endl; cout<<sizeof(b)<<endl; cout<<sizeof(c)<<endl; cout<<sizeof(d)<<endl; system("pause"); return 0;}
菱形继承运行结果:
二异性:
void Test(){//显示指定访问哪个父类的成员DD a;a.BB::_aa = "xxx";a.CC::_aa = "yyy";}
菱形虚拟继承可解决二异性,数据冗余浪费空间的问题(需在子类BB和CC继承父类AA时加Virtual)
菱形虚拟继承的代码如下:
#include<iostream>#include<stdlib.h>using namespace std;class AA{ public: int _aa;};class BB:virtual public AA{ public: int _bb;};class CC:virtual public AA{ public: int _cc;};class DD:public BB, public CC{ public: int _dd;};int main(){ AA a; BB b; CC c; DD d; d._aa = 0; d._bb = 1; d._cc = 2; d._dd = 3; cout<<sizeof(a)<<endl; cout<<sizeof(b)<<endl; cout<<sizeof(c)<<endl; cout<<sizeof(d)<<endl; system("pause"); return 0;}菱形虚拟继承的运行结果如下:
虚拟继承虽然解决了二异性和数据冗余的问题,但由两个运行结果可发现子类的大小并没有减小反而曾大了,比预算的多出了8个字节,则进一步探索其内存,可直观的看出其原因。
菱形对象模型:
菱形虚拟对象模型:
多态:当使用基类的指针或引用调用重写的虚函数时,当指向父类调用的就是父类虚函数,指向子类调用的就是子类虚函数
1 0
- C++ 虚表(探索多态的原理)和菱形继承
- 菱形继承与探索多态的原理
- 研究菱形虚拟继承和虚表(探索多态的原理)
- 研究虚表(探索多态的原理)和菱形虚拟继承
- 研究虚表(探索多态的原理)和菱形虚拟继承
- 研究虚表(探索多态的原理)和菱形虚拟继承
- 菱形虚拟继承和多态的原理
- 探索多态模型—菱形继承和菱形虚拟继承
- 菱形继承和菱形虚拟继承探索
- 虚表(探讨多态的原理)菱形虚拟继承
- 【C++】继承和多态之——菱形继承
- 【c++】菱形虚拟虚拟继承模型探索
- (C++)继承、菱形继承和虚继承的那些事儿
- 继承和多态 3.0 -- 菱形继承
- 【C++】继承(菱形继承)
- C++:菱形继承和虚拟继承
- 菱形虚拟继承和多态
- C++里的继承和多态(下)——单继承、多继承、菱形继承(含虚拟函数的继承)
- 改版工具怎么用,你知道吗?
- 网页不收录,都是邀请制惹的祸
- 移动体验大作战,冰桶算法全盘点
- maven-- web层中创建jsp时出错
- Mysql分析-show PROCESSLIST
- C++ 虚表(探索多态的原理)和菱形继承
- 这些违规落地页广告,你都知道吗?
- Jsp/Servlet及其相关技术详解复习总结
- 监听浏览器hash变化和html5 pullstate特性
- [LeetCode 27 Remove Element ]
- div垂直居中
- 关于java.util.NoSuchElementException的其中一种解决方案
- oracle回滚误操作导致数据丢失且已提交的数据
- (java)多个附件打包成压缩文件(*.ZIP)以及打包时常见的文件乱码和文件名乱码以及丢失文件或文件损坏问题解决办法