在类的继承时,会出现这样的一种可能性:菱形继承
我打个比方什么是菱形继承:
一个品牌A下有两个小品牌B和C,然后B和C又一起共同研发了D,这就是一个菱形继承,
如果用代码实现的话,就是这样的
class A {...};
class B : public A {...};
class C : public A {...};
class D : public B, public C {...};
那么这就会出现一个问题,D会拥有两份来自A的某种数据,这两份数据分别继承自B和C。
但是D并不需要两份数据,这时就出现了一种解决方法:虚继承。
虚继承的语法是这样的
class A {...};
class B : virtual public A {...};
打个比方的话,就是在B中创建了一个指针,指针指向A,而并非将A直接创建在B内
而这样,在菱形继承中,由于语法的关系,使用虚继承时,只会创建一个“爷类”(父类的父类)。
而两个父类中所指向的“爷类”的数据,是同样的。
就比如下面这份代码
#include<iostream>
using namespace std;
class Gfather {
public:
int age;
};
class Father1: virtual public Gfather {
};
class Father2: virtual public Gfather {
};
class Son: public Father1, public Father2 {
};
int main()
{
Son S;
S.age = 10;
cout << S.age <<endl;
cout << S.Father1::age << " " << S.Father2::age <<endl;
return 0;
}
而他的运行结果如下:
10
10 10
在没有对两个父类进行任何操作的情况下,他们所指向的父类的值就被改变了