菱形继承(多继承): 两个子类继承同一个父类,而又有子类 同时继承这两个子类。
菱形继承关系模型如下图:
菱形继承的代码如下: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个字节,则进一步探索其内存,可直观的看出其原因。菱形对象模型:
菱形虚拟对象模型:
多态:当使用基类的指针或引用调用重写的虚函数时,当指向父类调用的就是父类虚函数,指向子类调用的就是子类虚函数
新闻热点
疑难解答
图片精选