18. 多继承语法及菱形继承
多继承语法
- C++ 允许一个类继承多个类(一个子类多个父类)————> C++ 实际开发中不建议用多继承
- 语法:
class 子类 : 继承方式 父类1,继承方式 父类2...
- 注意:多继承可能会引发父类中有同名成员,需要加作用域区分。
#include <iostream>
using namespace std;
class Base1
{
public :
Base1()
{
m_a = 100;
}
int m_a;
};
class Base2
{
public :
Base2()
{
m_a = 100;
}
int m_a;
};
//子类继承Base1和Base2
class Son : public Base1 , public Base2
{
public :
Son()
{
m_c = 300;
m_d = 400;
}
int m_c;
int m_d;
};
void test01()
{
Son s;
cout << "sizeof Son =" << sizeof (s) <<endl;
// 当父类中出现同名成员,加作用域
cout << "Base1 :: m_a " << s.Base1::m_a << endl;
cout << "Base2 :: m_a " << s.Base2::m_a << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
菱形继承
概念:
- 两个派生类继承同一个基类
- 又有某个类同时继承者两个派生类
- 这种继承被称为菱形继承或钻石继承
我们来看一个小案例:假设有羊、驼、和羊驼三个动物,羊继承动物的数据,驼同样继承了动物的数据,当羊驼使用数据时,会产生二义性
菱形继承的问题:羊驼继承了两份动物数据,但这份数据我们只需要一份就可以了
可以利用虚继承来解决菱形继承的问题
#include <iostream>
using namespace std;
class Animal
{
public:
int m_age;
};
//羊类
class Sheep: virtual public Animal
{};
//驼类
class Tuo: virtual public Animal
{};
//羊驼类
class SheepTuo: public Sheep,public Tuo
{};
void test01()
{
SheepTuo st;
st.Sheep::m_age = 18;
st.Tuo::m_age = 28;
//当出现菱形继承的时候,两个父类拥有相同的数据,需要加以作用域区分
// 这份数据我们只需要一份,菱形继承导致数据有两份,造成资源浪费 ————> 利用虚继承解决菱形继承的问题
cout << "st.Sheep :: m_age ="<< st.Sheep::m_age<< endl;
cout << "st.Tuo0 :: m_age ="<< st.Tuo::m_age<< endl;
cout << "st.m_age = " << st.m_age << endl; // 发生虚继承后数据只有一个
}
int main()
{
test01();
system("pause");
return 0;
}
虚继承
- 利用虚继承,解决菱形继承的问题
- 继承之前加上关键字
virtual
变为虚继承 - 此例题中,Animal 类称为虚基类
哪有什么胜利可言,坚持意味着一切。如想使用请备注转载链接~