欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > c++继承

c++继承

2025/10/28 18:27:34 来源:https://blog.csdn.net/2302_80418176/article/details/147567479  浏览:    关键词: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,本篇文章就先水到这里,我们下期文章再见!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词