多继承
class子类:继承方式 父类1,继承方式 父类2
当两个或多个父类中,有同名的成员 被子类继承后,调用时候需要加作用域进行
#include<iostream>
using namespace std;
class Base1
{
public:
Base1()
{
this->m_a = 10;
}
int m_a;
};
class Base2
{
public:
Base2()
{
this->m_a = 20;
this->m_b = 20;
}
int m_a;
int m_b;
};
class Son:public Base1,public Base2
{
public:
int m_c;
int m_d;
};
void test01()
{
cout << sizeof(Son) << endl;
Son s;
cout << s.Base1::m_a << endl;
cout << s.m_b << endl;
cout << s.Base1::m_a << endl;
cout << s.Base2::m_a << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
菱形继承和虚继承
菱形继承
两个派生类继承同一个基类又有某个类同时继承两个派生类,这种继承被称为菱形继承或者钻石型继承
访问父类中的数据,需要加作用域区分具体数据
由于菱形继承 导致继承的数据有一份是浪费的
虚继承解决菱形继承带来的问题 // virtual
在Sheep和Tuo类中继承的内容为vbptr
v — virtaul
b — base
ptr — pointer
vbptr指向虚基类表 vbtable
#include<iostream>
using namespace std;
class Animal
{
public:
int m_age;
};
//virtual加上后 继承方式 数据虚继承
//Animal类变为虚基类
class Sheep:virtual public Animal
{
};
class Tuo :virtual public Animal
{
};
class SheepTuo :public Sheep, public Tuo
{
};
void test01()
{
SheepTuo st;
st.Sheep::m_age = 10;
st.Tuo::m_age = 20;
// m_Age只需要一份即可,菱形继承导致数据有一份浪费
cout << st.Sheep::m_age << endl;
cout << st.Tuo::m_age << endl;
cout << st.m_age << endl;
}
// 虚继承解决菱形继承带来的问题
// virtual
int main()
{
test01();
system("pause");
return 0;
}