虚继承

虚继承是为了解决多继承时出现的问题:命名冲突和数据冗余问题

菱形继承

命名冲突:

我们不知道Derive里面的num是从Base2里继承的还是Base3里继承的

数据冗余:

实际上这个num保存了两份

解决菱形继承问题

最直接的方式就是在使用变量时用 类名::变量或方法名 来区分

虚继承

1
2
3
4
5
6
7
8
9
10
class Base1{
public:
int num;
};
class Base2: virtual public Base1//虚继承
{};
class Base3: virtual public Base1//虚继承
{};
class Derive:public Base2,public: Base3
{};

存在命名冲突的成员变量在派生类中只保留一份,即间接基类中的成员在派生类中只保留一份

在菱形继承关系中,间接基类称为虚基类,直接基类和间接基类之间的继承关系称为虚继承 图中1,2