参考:C++ 虚拟继承问题
public virtual和virtual public效果是相同的(目前涉及到的知识范围没有区别)
虚拟继承解决二义性问题,保证无论派生多少次,只产生一次实例。
我们看下面一种情景:
class A
{
public:
int a;
};
class B : public A
{
public:
int b;
};
class C : public A
{
public :
int C;
};
class D : public B, public C
{
public:
void func()
{
}
};
为了更加方便理解,用图表示:
在这里插入图片描述
如上图,那么就会出现问题:类D中的成员变量 int a,如果访问a,就会出现二义性问题,到底是B中的a,还是C中的A,并且会造成数据冗余问题。
其中,对于二义性问题,我们加访问限定即可。例如 C::a;但对于数据冗余问题却没有办法解决。
于是C++中就引入了虚拟继承
将代码改为:
class A
{
public:
int a;
};
class B : virtual public A
{
public:
int b;
};
class C : virtual public A
{
public :
int C;
};
class D : public B, public C
{
public:
void func()
{
}
};
类中带有虚函数。内存结构会变为怎样?
直接继承:共用一个虚拟函数表
虚拟继承:不共用一个表,而且指针之间需要加偏移量。