概念
虚拟继承即将菱形继承中的公共基类设置为虚基类,从而解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据冗余和二义性的问题。这个时候从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,函数名也只有一个映射。
代码实现
class Base
{
public:
Base()
{
cout << "Base()" << endl;
}
void print()
{
cout << "Base::print()" << endl;
}
protected:
int base;
};
class A:virtual public Base
{
public:
A()
{
cout << "A()" << endl;
}
protected:
int a;
};
class B:virtual public Base
{
public:
B()
{
cout << "B()" << endl;
}
protected:
int b;
};
class C:public A,public B
{
public:
C()
{
cout << "C()" << endl;
}
protected:
int c;
};
void FunTest()
{
C c;
c.print();
}
int main()
{
FunTest();
return 0;
}
代码执行结果
当没有虚拟继承时结果为
使用虚拟继承后的结果为:
可以看出虚拟继承使基类构造函数在C对象的创建中之调用了一次。减少了数据的冗余。
同时,在没有使用virtual关键字的时候,无法直接调用c.print()。编译报错如图
而在使用virtual关键字后,编译可以通过。解决了二义性问题。