0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++之继承中构造和析构学习的总结

电子设计 来源:电子设计 作者:电子设计 2020-12-24 16:10 次阅读

在我们前面学习过类中的构造函数,以及析构函数,那么自然而然,在继承关系中,必然是存在着析构和构造着。

一、子类对象的构造

1、问题的引出

如何初始化父类成员?

父类构造函数和子类构造函数有什么关系?

2、子类中的构造函数怎样初始化父类成员:

子类中也是可以定义构造函数的:

--必须对继承而来的成员进行初始化,那么怎样初始化呢?这里有两种方式:

-直接通过初始化列表或者赋值的方式进行初始化

-调用父类构造函数进行初始化

3、父类构造函数在子类中的调用方式

默认调用

-适用于无参构造函数和使用默认参数的构造函数

显示调用

-通过初始化列表进行调用

-适用于所有父类构造函数

实践代码模板:

代码实践:

输出结果:

注解:通过上面的代码输出结果,我们可以发现,子类定义的对象如果没有没有传参,就隐式调用父类的构造函数;当然上面也使用了显示调用,通过初始列表的就可以看出。

4、构造规则

子类对象在创建时会首先调用父类的构造函数

先执行父类构造函数再执行子类的构造函数

父类构造函数可以被隐式调用或者显示调用

5、对象创建时构造函数的调用顺序

(1)调用父类的构造函数

(2)调用成员变量的构造函数

(3)调用类自身的构造函数

总结:先父母,后客人,再自己

代码实践:

输出结果:

注解:我们可以看到,先定义了一个Child对象,然后最先访问Object带参构造函数,然后再是Parent带参构造函数(说白了就是父类先触发),然后在子类Child中又包含了组合关系(也就是客人),然后Object类中的带参构造函数,最后再触发自身的带参构造函数。

二、子类对象的析构

1、析构函数的调用顺序与构造函数相反

(1)执行自身的析构函数

(2)执行成员变量的析构函数

(3)执行父类的析构函数

代码实践:

输出结果:

三、总结:

子类对象在创建时需要调用父类构造函数进行初始化

先执行父类构造函数然后执行成员的构造函数

父类构造函数显示调用需要在初始化列表中进行

子类对象在销毁时需要调用父类析构函数进行清理

析构顺序与构造顺序对称相反

审核编辑:符乾江
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 可编程逻辑
    +关注

    关注

    7

    文章

    515

    浏览量

    44083
  • C++
    C++
    +关注

    关注

    22

    文章

    2108

    浏览量

    73624
收藏 人收藏

    评论

    相关推荐

    同样是函数,在CC++中有什么区别

    同样是函数,在 CC++ 中有什么区别? 第一个返回值。 C语言的函数可以不写返回值类型,编译器会默认为返回 int。 但是 C++ 的函数,除了
    的头像 发表于 11-29 10:25 274次阅读

    C语言中申请的堆内存能不能自动释放

    C语言中申请的堆内存能不能自动释放?每次都要手动 free 太麻烦,也容易忘记。 学过 C++ 的同学,应该首先能想到智能指针。 但是这是C语言,没有类和对象、构造
    的头像 发表于 11-27 09:33 110次阅读

    C语言和C++结构体的区别

    同样是结构体,看看在C语言和C++中有什么区别?
    的头像 发表于 10-30 15:11 199次阅读

    C7000优化C/C++编译器

    电子发烧友网站提供《C7000优化C/C++编译器.pdf》资料免费下载
    发表于 10-30 09:45 0次下载
    <b class='flag-5'>C</b>7000优化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>编译器

    ostream在c++的用法

    ostream 是 C++ 标准库中一个非常重要的类,它位于 头文件(实际上,更常见的是通过包含 头文件来间接包含 ,因为 包含了 和 )。 ostream 类及其派生类(如 std::cout
    的头像 发表于 09-20 15:11 681次阅读

    基于OpenHarmony标准系统的C++公共基础类库案例:SafeQueue

    1、程序简介该程序是基于OpenHarmony的C++公共基础类库的线程安全队列:SafeQueue。线程安全队列,是在dequeue的基础上封装std::lock_guard,以此实现线程的相关
    的头像 发表于 08-30 12:41 296次阅读
    基于OpenHarmony标准系统的<b class='flag-5'>C++</b>公共基础类库案例:SafeQueue

    基于OpenHarmony标准系统的C++公共基础类库案例:SafeStack

    1、程序简介该程序是基于OpenHarmony的C++公共基础类库的线程安全队列:SafeQueue。线程安全队列,是在dequeue的基础上封装std::lock_guard,以此实现线程的相关
    的头像 发表于 08-30 12:41 320次阅读
    基于OpenHarmony标准系统的<b class='flag-5'>C++</b>公共基础类库案例:SafeStack

    C++语言基础知识

    电子发烧友网站提供《C++语言基础知识.pdf》资料免费下载
    发表于 07-19 10:58 7次下载

    C++实现类似instanceof的方法

    C++有多态与继承,但是很多人开始学习C++,有时候会面临一个常见问题,就是如何向下转型,特别是不知道具体类型的时候,这个时候就希望C++
    的头像 发表于 07-18 10:16 574次阅读
    <b class='flag-5'>C++</b><b class='flag-5'>中</b>实现类似instanceof的方法

    鸿蒙OS开发实例:【Native C++

    使用DevEco Studio创建一个Native C++应用。应用采用Native C++模板,实现使用NAPI调用C标准库的功能。使用C标准库hypot接口计算两个给定数平方和的平
    的头像 发表于 04-14 11:43 2596次阅读
    鸿蒙OS开发实例:【Native <b class='flag-5'>C++</b>】

    使用 MISRA C++:2023® 避免基于范围的 for 循环中的错误

    在前两篇博客,我们 向您介绍了新的 MISRA C++ 标准 和 C++ 的历史 。在这篇博客,我们将仔细研究以 C++
    的头像 发表于 03-28 13:53 787次阅读
    使用 MISRA <b class='flag-5'>C++</b>:2023® 避免基于范围的 for 循环中的错误

    c语言,c++,java,python区别

    操作系统、嵌入式系统等对性能要求较高的场景。C语言的语法相对简单,学习曲线较平缓,也是学习其他高级语言的入门语言。 C++C++是在
    的头像 发表于 02-05 14:11 2370次阅读

    vb语言和c++语言的区别

    Microsoft开发的一种面向对象的事件驱动编程语言。它的设计目标是简化编程过程,让初学者也能快速上手。与相比,C++语言是一种通用的、面向对象的编程语言,其设计目标是提供高性能的系统级编程。 语法: VB语言的语法较为简单,使用了很多可读性强的关键词,如“
    的头像 发表于 02-01 10:20 2263次阅读

    C++简史:C++是如何开始的

    的 MISRA C++:2023 博客系列的第二部分。 在这篇博客,我们将深入探讨 C++ 的历史、编程语言多年来的发展历程以及它的下一步发展方向。
    的头像 发表于 01-11 09:00 582次阅读
    <b class='flag-5'>C++</b>简史:<b class='flag-5'>C++</b>是如何开始的

    基于C/C++面向对象的方式封装socket通信类流程简

    在掌握了基于 TCP 的套接字通信流程之后,为了方便使用,提高编码效率,可以对通信操作进行封装,本着有浅入深的原则,先基于 C 语言进行面向过程的函数封装,然后再基于 C++ 进行面向对象的类封装。
    的头像 发表于 12-26 10:00 1815次阅读