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
原创粉丝点击