c++继承
本篇文章只是对之前的继承文章做一个重启!
继承的语法格式
class 子类(派生类):继承方式 父类(基类){}
继承的方式
public 公共类
private 私有类
protected 保护类
总结
1.私有的,不管使用什么继承方式都不可访问
2.保护类, 保护或公共方式继承则依旧是保护
3.公共类,随继承方式改变
继承之构造函数与析构函数的调用顺序
从上面两张图中,我们可以看到,继承父类之后,初始化时,会先调用父类的构造函数,再调用子类的构造函数,析构时,则与初始化时相反,会先调用子类的析构函数,再调用父类的析构函数
总结
初始化时:先调用父类的构造函数,再调用子类的构造函数
析构时:先调用子类的析构函数,再调用父类的析构函数
菱形继承
概念
两个派生类同时继承一个基类,同时又有一个新的类继承了这两个派生类,这种情况就叫菱形继承
引发的问题
1.资源浪费 2.会引发二义性
解决方法
在继承方式之前,添加关键字virtual,使之变为虚继承
案例
错误代码
#include<iostream>
using namespace std;
class animal
{
public:int a_age = 10;
};
class sheep :public animal
{};
class tuo :public animal
{};
class sheeptuo : public sheep, public tuo
{};
int main()
{sheeptuo st;st.sheep::a_age = 25;st.tuo::a_age = 39;cout << "st.sheep::a_age = " << st.sheep::a_age << endl;cout << "st.tuo::a_age = " << st.tuo::a_age << endl;cout << "st.a_age" << st.a_age << endl;return 0;
}
解决方法
在继承方式前面添加关键字virtual
修改后的代码
#include<iostream>
using namespace std;
class animal
{
public:int a_age = 10;
};
class sheep :virtual public animal
{};
class tuo :virtual public animal
{};
class sheeptuo : public sheep, public tuo
{};
int main()
{sheeptuo st;st.sheep::a_age = 25;st.tuo::a_age = 39;cout << "st.sheep::a_age = " << st.sheep::a_age << endl;cout << "st.tuo::a_age = " << st.tuo::a_age << endl;cout << "st.a_age = " << st.a_age << endl;return 0;
}
那么它的底层是怎么回事?来看一下博主下面的解释
底层逻辑
右边的图是我们一开始的代码(没有虚继承的代码),从图中可以很明显地看见有两份age,而虚继承后(左边的图)age少了一份,并且多了两个vbptr和两个vbtable,这两个vbptr是虚基类指针,vbtable是虚基类表格
这里的底层逻辑就给大家画在图上了。
那么最后总结一下这个底层逻辑
总结
使用虚继承后底层会出现vbptr指针,它会指向虚基类表格从而避免出现菱形继承出现的情况
ok,本篇文章就先水到这里,我们下期文章再见!