一、多继承
class A
{
public:
int m_a;
};
class B
{
public:
int m_b;
};
class C:public B,public A //多继承
{
public:
int m_c;
};
二、菱形继承
会发生二义性和数据冗余
菱形继承的代码:
#include<iostream>
using namespace std;
class A
{
public:
int m_a;
};
class B:public A
{
public:
int m_b;
};
class C:public A
{
public:
int m_c;
};
class D :public B, public C //菱形继承,类D继承了两个来自基类的m_a,会出现二义性
{
public:
int m_d;
};
int main(){
D d; //菱形继承,继承了两个m_a
d.m_a = 2; //报错,出现二义性,不知道是哪个m_a;
d.B::m_a = 2; //加上指定类作用域才行
system("pause");
return 0;
}
下面的图是类D的菱形继承的内存模型,可以看到有两个来自基类class A的m_a,所以出现二义性和数据冗余
三、虚继承
虚继承就是为了解决菱形继承的**二义性**和**数据冗余**的问题。
#include<iostream>
using namespace std;
class A
{
public:
int m_a;
};
class B:virtual public A //加上virtual关键字,实现虚继承
{
public:
int m_b;
};
class C:virtual public A //加上virtual关键字,实现虚继承
{
public:
int m_c;
};
class D :public B, public C //虚继承解决了菱形继承的问题
{
public:
int m_d;
};
int main(){
D d;
d.m_a = 2; //正确,加上虚继承之后,只继承一个相同的基类成员m_a;
d.B::m_a = 2; //和上面的效果相等,同一个变量
system("pause");
return 0;
}
再来看虚继承之后的菱形继承内存模型,可以看到只继承了一个m_a,所以解决了菱形继承的问题