本篇主要来讲解一下多继承的概念,
多继承模式:
class A既可以拥有B1的属性,又可以拥有B2的属性。
多继承也有缺陷,容易产生二义性。
这个时候需要使用作用域来解决二义性的问题,
下面上代码演示:
/****************************************************
* brief : 多继承的概念及缺点
* author : shao
* date : 2020-04-07
* note : 多继承容易引发二义性,需要用作用域来解决
*
****************************************************/
#include <iostream>
using namespace std;
class Base1{
public:
int m_A;
int m_D;
Base1()
{
m_A = 10;
m_D = 15;
}
};
class Base2{
public:
int m_B;
int m_D;
Base2()
{
m_B = 20;
m_D = 25;
}
};
class Son : public Base1, public Base2{
public:
int m_C;
Son()
{
m_C = 30;
}
};
void test01(void)
{
Son s;
//调用父类Base1中的成员
cout << "s.m_A : " << s.m_A << endl;
//调用父类Base2中的成员
cout << "s.m_B : " << s.m_B << endl;
//调用自身成员
cout << "s.m_C : " << s.m_C << endl;
/**
* 当调用m_D的时候,出现二义性。
* 编译器不知道需要调用哪个父类的成员,
* 这个时候需要使用作用域来解决二义性的问题。
*/
//cout << "s.m_D : " << s.m_D << endl;
cout << "s.Base1::m_D : " << s.Base1::m_D << endl;
cout << "s.Base2::m_D : " << s.Base2::m_D << endl;
}
int main(void)
{
test01();
return 0;
}
运行结果如下:
可以看到,在调用成员m_D的时候产生二义性,需要用类的作用域来区分,
我们需要调用的是Base1还是Base2类中的m_D成员。