多继承语法
C++允许一个类继承多个类,但在实际开发中并不建议去使用,可能会引发一些错误难以发现,比如菱形继承
语法:class 子类 : 继承方式 父类1 , 继承方式 父类2 .
多继承语法可能会引发父类中同名成员出现,子类使用时需要加作用域区分
菱形继承
菱形继承的概念:
两个派生类继承同一个基类
又有某个类同时继承两个派生类
这种继承就称为菱形继承,或者钻石继承
问题:
两个子类同时继承了父类的数据,当子类的子类使用数据时就会产生二义性 这是需要加作用域
子类的子类,同时继承了两个子类的数据,但是这份数据应只有一份
解决:
虚继承:利用虚继承可以解决菱形继承的问题 继承之前加上关键字virtual,此时的父类称虚基类
虚继承之后,此时的两个子类实际上存储着一个指针,而指针指向一个表,表中记录了偏移量,加上偏移地址即可找到所要的数据,也就是此时的只有一份数据
测试:
#include<iostream>
using namespace std;
//父类
class Base
{
public:
int m_Age;
};
//子类1
class Son1:virtual public Base
{
};
//子类2
class Son2 :virtual public Base
{
};
//子类的子类
class Grandson : public Son1, public Son2
{
};
void test()
{
Grandson st;
st.Son1::m_Age = 28;
st.Son2::m_Age = 18;
//由于父类中的年龄现在只有一份数据,所以这两个赋值其实是对一个值进行赋值(子类中的虚指针指向同一个数据)
cout << "st.Son1::m_Age = " << st.Son1::m_Age << endl << endl;//输出18
cout << "st.Son2::m_Age = " << st.Son2::m_Age << endl;//输出18
cout << "st.m_Age = " << st.m_Age << endl;//输出18
}
int main()
{
test();
system("pause");
return 0;
}