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