前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++中构造函数、虚函数、析构函数的执行顺序

C++中构造函数、虚函数、析构函数的执行顺序

作者头像
越陌度阡
发布于 2020-11-26 04:25:21
发布于 2020-11-26 04:25:21
2.6K00
代码可运行
举报
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
复制
#include <iostream>
using namespace std;

class A
{
public:
    // 第一步:执行类A的构造函数,输出"构造函数A"
    A() { cout << "构造函数A" << endl; }

    virtual void func()
    {
        cout << "构造A" << endl;
    }
    // 第七步:执行类A的析构函数,输出"析构函数A"
    ~A() { cout << "析构函数A" << endl; }
    virtual void fund()
    {
        cout << "清除A" << endl;
    }
};

class B : public A
{
public:
    // 第二步:执行类B的构造函数,调用类A里虚函数,输出"构造A"
    B() { func(); }
    // 第四步:执行主函数里的c.fun(),输出"开始...",并调用func();
    // 由于fun()不是构造函数和析构函数,且func()为虚函数
    // 所以最终结果输出"开始...类C"
    void fun()
    {
        cout << "开始...";
        func();
    }
    // 第六步:执行类B的析构函数,调用fund()函数;
    // 由于是在析构函数里,且fund()为虚函数,所以执行类A里的fund();
    // 输出清除A
    ~B() { fund(); }
};

class C : public B
{
public:
    // 第三步:执行类C的构造函数,输出"构造函数C"
    C()
    {
        cout << "构造函数C" << endl;
    }
    void func()
    {
        cout << "类C" << endl;
    }
    // 第五步:执行类C的析构函数,输出"清除C"
    ~C() { fund(); }
    void fund()
    {
        cout << "清除C" << endl;
    }
};

int main()
{
    C c;
    c.fun();
    return 0;
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/02/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
从零开始学C++之虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图
s1mba
2017/12/28
1.3K0
从零开始学C++之虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图
C++不要在构造函数和析构函数中调用虚函数
虽然可以对虚函数进行实调用,但程序员编写虚函数的本意应该是实现动态联编。在构造函数中调用虚函数,函数的入口地址是在编译时静态确定的,并未实现虚调用。但是为什么在构造函数中调用虚函数,实际上没有发生动态联编呢?
恋喵大鲤鱼
2018/08/03
4.1K0
C++-虚函数之构造函数与析构函数分析
假如构造函数是虚函数的话,由于对象开始还未分配内存空间,所以根本就无法找到虚函数表,从而构造函数也无法被调用.所以构造函数是不能成为虚函数.
诺谦
2019/05/24
1.3K0
构造函数和析构函数可以是虚函数吗,在里面能调用虚函数吗
在内存上,我们知道,一个对象会有一个虚函数表,虚函数表在构造函数中初始化,可是一个对象还没有完成实例化,他的虚函数表是不存在的,一个对象需要调用构造函数完成实例化,这里形成了一个悖论
opencode
2022/12/26
1.7K0
C++编程经验(4):不要在构造函数和析构函数中使用虚函数
这个事情呢,其实我们平时也不会去做的,对吧。 当然要是做了的话,那也可以做好某些天连夜加班的准备。
看、未来
2021/09/18
1.8K0
C++学习笔记 -- 虚析构函数与纯虚析构函数
一个类维护一个虚函数相关的表--vtable(__vfptr指向它),函数声明前面包含关键字“virtual”的函数,就会创建一个指向该函数的指针(函数指针)被存入vtable中。
meteoric
2018/11/16
1.9K0
C++类的构造函数与析构函数
C++中每个类都有其构造与析构函数,它们负责对象的创建和对象的清理和回收,即使我们不写这两个,编译器也会默认为我们提供这些构造函数。下面仍然是通过反汇编的方式来说明C++中构造和析构函数是如何工作的。
Masimaro
2018/08/31
1.8K0
【C++】多态 ⑨ ( vptr 指针初始化问题 | 构造函数 中 调用 虚函数 - 没有多态效果 )
构造函数 的 作用就是 创建对象 , 构造函数 最后 一行代码 执行完成 , 才意味着 对象构建完成 , 对象构建完成后 , 才会将 vptr 指针 指向 虚函数表 ;
韩曙亮
2023/11/02
4230
【C++】多态 ⑨ ( vptr 指针初始化问题 | 构造函数 中 调用 虚函数 - 没有多态效果 )
C++纯虚函数与抽象类
为什么说虚函数是C++最重要的特性之一呢,因为虚函数承载着C++中动态联编的作用,也即多态,可以让程序在运行时选择合适的成员函数。虚函数必须是类的非静态成员函数(且非构造函数),其访问权限是public。那么: (1)为什么类的静态成员函数不能为虚函数? 如果定义为虚函数,那么它就是动态绑定的,也就是在派生类中可以被覆盖的,这与静态成员函数的定义(在内存中只有一份拷贝,通过类名或对象引用访问静态成员)本身就是相矛盾的。
恋喵大鲤鱼
2018/09/27
1.6K0
C++进阶:详解多态(多态、虚函数、抽象类以及虚函数原理详解)
注意:在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承后基类的虚函数被继承后在派生类依旧保持虚函数属性)但是该种写法不规范,大家还是少用为好。
是Nero哦
2024/03/17
6540
C++进阶:详解多态(多态、虚函数、抽象类以及虚函数原理详解)
【c++】全面理解C++多态:虚函数表深度剖析与实践应用
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价
用户11029103
2024/05/24
3880
C++:构造函数与析构函数
构造函数用于对象的初始化,一旦建立对象,就需要有一个有意义的初始值,构造函数的作用即是在对象初始化时被调用,给对象分配内存空间以及完成初始化。
字节星球Henry
2021/08/09
6370
从零开始学C++之虚函数与多态(二):纯虚函数、抽象类、虚析构函数
一、纯虚函数 虚函数是实现多态性的前提 需要在基类中定义共同的接口 接口要定义为虚函数 如果基类的接口没办法实现怎么办? 如形状类Shape 解决方法 将这些接口定义为纯虚函数
s1mba
2017/12/28
1.5K0
从零开始学C++之虚函数与多态(二):纯虚函数、抽象类、虚析构函数
反常识:为什么虚函数在构造和析构时并不“虚”?
本文也是读者朋友面试大疆时的面试真题,据读者反馈,面试官问:构造函数和析构函数可以调用虚函数吗?事后读者朋友向我求助时,我的回答是,当然可以。这样回答绝对正确,但是这不是面试官想考察的点,如上回答可能连一面都过不了。
程序员的园
2025/02/12
1460
反常识:为什么虚函数在构造和析构时并不“虚”?
七、构造函数与析构函数
在C++中,构造函数是一种特殊的成员函数,它用于初始化类的对象。当创建类的对象时,构造函数会被自动调用。构造函数的名字与类的名字相同,并且没有返回类型(即使是void也没有)。
用户11332765
2024/10/28
2820
虚函数详解[通俗易懂]
面向对象的语言有三大特性:继承、封装、多态。虚函数作为多态的实现方式,重要性毋庸置疑。
全栈程序员站长
2022/09/17
2K0
虚函数详解[通俗易懂]
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
之前我们在 类和对象(上)中了解了关于类的定义、对象的创建等一些基本知识:
ephemerals__
2024/10/24
4650
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
虚析构函数? vptr? 指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?
根据给定的文章内容,撰写摘要总结。
s1mba
2017/12/28
1.1K0
虚析构函数? vptr?  指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?
【c++】多态(多态的概念及实现、虚函数重写、纯虚函数和抽象类、虚函数表、多态的实现过程)
本篇文章是继继承之后,博主跟大家介绍面向对象三大特性的最后一个——多态。
ephemerals__
2024/12/25
5620
【c++】多态(多态的概念及实现、虚函数重写、纯虚函数和抽象类、虚函数表、多态的实现过程)
虚析构与纯虚析构(C++)
其中,virtual void func() = 0;称为纯虚函数,也即是在成员函数的开头加上virtual关键词,且没有函数实现,取而代之的是末尾的=0;,而一旦类中有一个纯虚函数,则该类被称为抽象类,抽象类具有以下特点:
LonelyEnderman
2022/10/27
6680
虚析构与纯虚析构(C++)
推荐阅读
相关推荐
从零开始学C++之虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档