一、基本概念
菱形继承是指存在两个子类继承自同一个基类,同时有子类继承这两个子类。
二、程序举例
1. 虚继承
使用虚继承可以解决菱形继承资源浪费的问题,因为有两个子类继承基类,子类对象调用两个父类作用域下属性时,会发生资源浪费,两个子类分别调用基类的构造函数,生成两份基类所含有的数据成员。用虚继承,只调用一次构造函数和析构,所以避免资源浪费。
#include <iostream>
using namespace std;
class Person
{
public:
int Age;
};
class Gril : virtual public Person
{
};
class Boy : virtual public Person
{
};
class Child : public Gril, public Boy
{
};
int main()
{
Child A;
A.Gril::Age = 5;
A.Boy::Age = 10;
cout << A.Gril::Age << endl;
cout << A.Boy::Age << endl;
}
10
10
2. 内在逻辑
可以使用VS的开发者工具解释其内在逻辑。
虚继承时,虚基类指针vbptr指向虚基类表vbtable,虚基类表中存放的就是数据相对于虚基类指针的偏移,然后根据偏移找到数据。