c++之旅第七弹——继承

这篇具有很好参考价值的文章主要介绍了c++之旅第七弹——继承。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大家好啊,这里是c++之旅第七弹,跟随我的步伐来开始这一篇的学习吧!

如果有知识性错误,欢迎各位指正!!一起加油!!

创作不易,希望大家多多支持哦!

c++之旅第七弹——继承,c++,开发语言

一.继承和派生:(实质上是一个过程,不过是从不同角度来看的)

1.继承方式:

单继承:

class A
{};
class B:public A
{};

多继承:

class D
{};
class E
{};
class F:public D,public E
{};

多级继承:

class A
{};
class B:public A
{};
class C:public B
{};
class D:public C
{};
//多级继承,
//D 拥有了 A,B,C 的所有属性

2.继承涉及的属性问题:

(1)以上的继承动作属性都是公有,不过还有和类中成员相同的其他属性:私有和保护

继承时基类中的成员属性和继承动作的属性是一起决定派生类中的成员属性的,两者同时考虑,那个更严格派生类中该成员的属性就是哪个属性(私有>保护>公有),所以一般使用公有继承,这样可以保留原来基类中成员的原有属性不变

(2)如果基类中某一成员是私有属性,那么无论使用那种继承方式,在派生类中也是无法进行直接访问的,要访问也只能通过公有接口来进行访问,如果类B继承类A时继承方式是私有,而基类A中成员的属性为公有,那么在派生类B中是可以进行基类A中该成员的访问的,而当派生类C继承B时使用任何继承方式都无法对基类A中的该成员进行访问,这是因为B继承A时使用私有继承方式,相当于A类是B类的私有属性成员。

(3)保护属性成员可以在派生类中进行访问,但是不可以在派生类的派生类中进行访问

(4)基类如果是带参构造,在派生类通过成员初始化列表进行构造函数的调用:

class B :public A
{
    int d;
public:
    B(int i) :A(i)//基类如果是带参构造,在派生类通过成员初始化列表进行构造函数的调用
    {
        d = 3;
    }
    ~B()
    {
    }
};

3.有关继承和派生中的内存问题:

(1)派生类可以作为基类对象,基类对象不可以作为派生类对象,也就是进行赋值操作,这是因为派生类的内存是大于基类的内存的,用派生类对象来给基类对象进行赋值可以使基类对象中的内存都放满,剩余的不属于基类,放不进去也无所谓;而如果将基类赋值给派生类对象时,就会出现派生类对象的内存有空缺,无法表示派生类,所以这种赋值是无法进行的。

(2)若使用多级继承,那么最终的类类型对象的成员在内存中的表现为嵌套时最内部的类的成员是储存在最终的派生类对象中最前面的内存区域

三,继承之后:派生类可以继承父类中的所有数据成员和函数成员除了构造和析构函数,这是属于类自身的,无法进行继承

(1)继承之后派生类的构成:继承时如果基类和派生类中有同名的成员,在派生类中进行调用时优先调用派生类中的成员,局部优先于全局,如果想要调用的是基类中的成员,那么需要使用类名作用域来进行调用,因为包含一个无名的对象,无法使用对象名作用域来进行访问,使用类名作用域代替之,多继承同样可以使用类名作用域来进行成员的访问

//继承时的访问:
class CA
{
protected:
    int a;
public:
    CA()
    {
        a = 10;
    }
};
​
class CB : public CA
{
    int a;
public:
    CB()
    {
        CA::a = 123;//在CB对象里面包含一个无名的CA对象,所以只能通过类型去作用域访问
        a = 20;
    }
};

(2)在定义一个派生类对象时,其构造顺序为先构造基类对象,然后再在基类的基础上构造派生类对象,也就是调用构造函数的顺序,然后当程序运行结束时(假设是在栈区的对象)析构函数是反向来进行析构的,这和栈结构有关,但是在堆区进行以上操作时,也是遵循以上规律(构造是通过new开辟堆区内存,析构是手动使用delete来进行指针的删除)

四, 菱形继承:一个基类(共同基类)派生出两个类(间接基类),这两个类再进行多继承至一个类(最终类)

1.菱形继承虚继承时两个间接基类都要写virtual关键字,这样才能起到虚继承应该起到的作用,否则还是会进行共同基类的二次拷贝,因为写了virtual关键字才可以使间接基类拥有多的四个字节,有指针的作用,可以寻找共同基类是否已经构造过,从而避免多次拷贝

2.虚继承间接基类中多的四字节相当于是指针,可以用来寻找共同基类是否已经构造过了,若构造过就不会再次构造,这样可以减少当共同基类内存大时的没有必要的二次拷贝内存

3.尽量不写菱形继承,因为会引起一些问题,主要包括以下几点原因:

(1)虚基类冗余数据:在菱形继承中,由于共同基类被多次继承,会导致虚基类中的数据在派生类中存在多份冗余拷贝,增加了内存消耗。

(2)构造函数调用顺序不明确:在菱形继承中,由于存在多条继承路径,构造函数的调用顺序可能变得复杂,不易理解和维护。

(3)内存布局不清晰:由于存在多份冗余数据和多条继承路径,菱形继承的内存布局变得复杂,容易引起内存对齐、访问越界等问题。

(4)代码可读性差:菱形继承会增加代码的复杂性,降低代码的可读性和可维护性,使程序难以理解和调试。

如果一定要写,尽量使用虚继承方式

4.构造顺序:虚基类->基类->派生类,虚基类的无名对象是在继承的最终类对象中的最后部分的内存,且只有一份它的内存。文章来源地址https://www.toymoban.com/news/detail-847783.html

到了这里,关于c++之旅第七弹——继承的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PAT(Advanced Level)刷题指南 —— 第七弹

    排序问题,原题叙述比较清晰,按照A C M E四种排序的最高名次以及对应的排序方式输出。

    2024年02月13日
    浏览(35)
  • 【Python气象处理绘图第七弹–泰勒图绘制】

    在进行模式评估的过程中,常常需要评估模式的模拟性能,这通常由空间相关系数(CC),相对标准差(SD)及其中心化的均方根误差(RMSE)体现,这三者又常常可以由泰勒图具体体现。RMSE越接近0,CC和SD越接近1,模式模拟能力越好 泰勒图 23.泰勒图 对于气象格点数据,其通常

    2024年02月07日
    浏览(31)
  • 【C/C++】C语言开发者必读:迈向C++的高效编程之旅

    🧑 作者简介 :阿里巴巴嵌入式技术专家,深耕嵌入式+人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍 :分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导、简历面试辅导、技术架构设计优化、开发外包等

    2024年03月20日
    浏览(48)
  • k8s控制器之Deployment第七弹之查看Deployment的状态

    Deployment 的生命周期中有不同状态,大致可分为三种 rogressing 正在执行滚动更新 complete fail to progress Progressing 状态 当如下任何一个任务正在执行时,kubernnete将Deployment 的状态标记为 progressing ; Deployment 创建了一个新的 ReplicaSet Deployment 正在 scale up 其最新的 ReplicaSet Deployment 正在

    2024年02月14日
    浏览(44)
  • C语言第二十七弹---内存函数

    ✨ 个人主页:  熬夜学编程的小林 💗 系列专栏:  【C语言详解】 【数据结构详解】 内存函数 1、memcpy 使用和模拟实现 2、memmove 使用和模拟实现 3、memset 函数的使用 4、memcmp 函数的使用 总结 前面两弹讲解了字符函数和字符串函数,但是在我们实际运用中不仅仅只有这些

    2024年02月19日
    浏览(35)
  • C++类开发第七篇(详细说说多态和编译原理)

    多态性(polymorphism)提供接口与具体实现之间的另一层隔离,从而将”what”和”how”分离开来。多态性改善了代码的可读性和组织性,同时也使创建的程序具有可扩展性,项目不仅在最初创建时期可以扩展,而且当项目在需要有新的功能时也能扩展。 c++支持编译时多态(静态多

    2024年03月09日
    浏览(49)
  • 【鸿蒙开发】第七章 ArkTS语言UI范式-基础语法

    通过前面的章节,我们基本清楚鸿蒙应用开发用到的语言和项目基本结构,在【鸿蒙开发】第四章 Stage应用模型及项目结构也提到过ArkTS的UI范式的 基本语法 、 状态管理 、 渲染控制 等能力,简要介绍如下: 基本语法 : ArkTS 定义了 声明式UI描述 、 自定义组件 和 动态扩展

    2024年02月03日
    浏览(60)
  • c、c++、java、python、js对比【面向对象、过程;解释、编译语言;封装、继承、多态】

    目录 内存管理、适用 区别 C 手动内存管理:C语言没有内置的安全检查机制,容易出现内存泄漏、缓冲区溢出等安全问题。 适用于系统级编程 C++ 手动内存管理:C++需要程序员手动管理内存,包括分配和释放内存,这可能导致内存泄漏和指针错误。 适用于游戏引擎和系统级编

    2024年02月08日
    浏览(73)
  • C++类开发的第六篇(虚拟继承实现原理和cl命令的使用的bug修复)

    接上一篇末尾虚拟继承的简单介绍之后,这篇来详细讲一下这个内存大小是怎么分配的。 cl 是 Microsoft Visual Studio 中的 C/C++ 编译器命令。通过在命令行中键入 cl 命令,可以调用 Visual Studio 的编译器进行编译操作。 cl 命令提供了各种选项和参数,用于指定源文件、编译选项、

    2024年03月09日
    浏览(45)
  • 【C++】继承基础知识及简单应用,使用reportSingleClassLayout(在Visual Studio开发人员命令提示窗口)查看派生类详细信息

    author:Carlton tag:C++ topic:【C++】继承基础知识及简单应用,使用reportSingleClassLayout(在Visual Studio开发人员命令提示窗口)查看派生类详细信息 website:黑马程序员C++ date:2023年7月22日 目录 概要 继承规则 对象模型 构造析构顺序 同名与静态同名成员 多继承 菱形继承 VS开发人

    2024年02月16日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包