1、virtual虚继承
多继承,是指一个子类,继承了两个不同的父类。若这俩个不同的父类,又继承自同一个爷爷类,那么就形成了所谓的 菱形继承。
像上面这种继承关系的例子,在实际使用中,一个人不会用两个姓氏。但其实上确实是拷贝了两份同名变量,所以会有歧义。
在现实意义中,类内的两个同名变量的用处不大,如果换个例子,当爷爷类是家具,有个成员变量表示材料。两个子类分别是沙发和床,然后有一个沙发床多继承自沙发还有床,那这个沙发床无论是继承自谁,永远也支持一种材料(来自爷爷的隔代继承)
当出现菱形继承时,为了避免出现歧义,爸爸类要声明为虚继承,这样孙子类的变量就只有一份,来自爷爷类。
虚继承的作用,只有一个:防止孙子类(多继承)继承的成员变量,会拷贝多份。
#include <iostream>
#include <cstring>
#include <memory>
using namespace std;
class yeye
{
public:
yeye()
{
cout<<"yeye()....."<<endl;
m_a = 111;
}
yeye(int a)
{
cout<<"yeye(int a)....."<<endl;
m_a = a;
}
public:
int m_a;
};
class baba : virtual public yeye
{
public:
void babashow()
{
cout<<"i am baba,m_a="<<this->m_a<<endl;
}
};
class mama : virtual public yeye
{
public:
void mamashow()
{
cout<<"i am mama,m_a="<<this->m_a<<endl;
}
};
class sunzi : public baba, public mama
{
public:
void sunzishow()
{
//cout<<"i am sunzi,baba::m_a="<<m_a<<endl;//编译报错 error: m_a有歧义 is ambiguous
//cout<<"i am sunzi,baba::m_a="<<baba::m_a<<",mama::m_a="<<mama::m_a<<endl;//实在想用的话 可以加上类作用域
cout<<"i am sunzi,sunzi::m_a="<<m_a<<endl;//当多继承的父类,按virtual继承,编译可以通过
}
};
int main(void)
{
sunzi s1;
s1.babashow();
s1.mamashow();
s1.sunzishow();
return 0;
}