首页 > 编程 > C++ > 正文

C++ 虚表(探索多态的原理)和菱形继承

2019-11-08 19:45:55
字体:
来源:转载
供稿:网友

                                    虚表(探索多态原理)和菱形继承

菱形继承(多继承):  两个子类继承同一个父类,而又有子类 同时继承这两个子类。

菱形继承关系模型如下图:

 

菱形继承的代码如下: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个字节,则进一步探索其内存,可直观的看出其原因。菱形对象模型:菱形虚拟对象模型:多态:当使用基类的指针或引用调用重写的虚函数时,当指向父类调用的就是父类虚函数,指向子类调用的就是子类虚函数

 

 
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选