如果一个类从多个类继承而来,而这些类有公共基类。那么在多该基类中定义的成员访问时会出现二义性。C++设计虚继承来解决这个问题。虚继承的本质就是子类引用父类的内存空间,而不创建自己的内存空间。这样既解决了多重继承可能引发的二义性问题,也使得内存得以释放。
在虚继承过程中的基类被叫做:虚基类
那么实际上,虚继承的本质就是使用一个指向虚基类的指针,这样就无论你怎么继承,就只有一份基类内存空间。
C++使用关键字virtual来进行虚继承。
语法:class B : virtual public A{};
#include<iostream>
using std::cout;
using std::endl;
class MyClass
{
public:
int a;
int b;
};
class C1 : virtual public MyClass
{
public:
};
class C2 : virtual public MyClass
{
public:
};
class Last : public C1, public C2 //多继承
{
};
int main()
{
Last L;
L.a;
return 0;
}
通过虚继承,这样MyClass类的内存空间只有一份。就不会有二义性了。
还有一种情况是这样的。
这种情况下,虚继承也无法帮到我们。我们只能使用
c.A::a;
c.B::a;
来明确对类成员的调用,从而避免二义性的产生。