zoukankan      html  css  js  c++  java
  • 构造函数和析构函数的调用顺序

    上一篇说到了virtual关键字的使用范围以及虚函数。

    先上一段代码:

     1 #include "pch.h"
     2 #include <iostream>
     3 using namespace std;
     4 
     5 class Father {
     6 public:
     7     Father() {
     8         cout << "我是父类的构造函数" << endl;
     9     }
    10     ~Father() {
    11         cout << "~我是父类的析构函数" << endl;
    12     }
    13 };
    14 class Child1 : public Father {
    15 public:
    16     Child1() {
    17         cout << "我是子类1的构造函数" << endl;
    18     }
    19     ~Child1() { 
    20         cout << "我是子类1的析构函数" << endl;
    21     }
    22 };
    23 
    24 
    25 int main()
    26 {
    27     Father *fa = new Child1();
    28     delete fa;
    29 }

    输出是:

    我是父类的构造函数
    我是子类1的构造函数
    ~我是父类的析构函数

    可见子类的析构函数并未被调用,因为delete掉的是指向父类的指针,子类的对象还是仍然存在,这是很危险的,子类的那一片内存空间并未被释放。

    想要同时调用子类的析构函数,我们需要将父类的析构函数设置成为虚析构函数,将父类指针动态绑定到子类对象上,这时执行析构函数时,就会先析构子类,再析构父类了。

     1 #include "pch.h"
     2 #include <iostream>
     3 using namespace std;
     4 
     5 class Father {
     6 public:
     7     Father() {
     8         cout << "我是父类的构造函数" << endl;
     9     }
    10     virtual ~Father() {
    11         cout << "~我是父类的析构函数" << endl;
    12     }
    13 };
    14 class Child1 : public Father {
    15 public:
    16     Child1() {
    17         cout << "我是子类1的构造函数" << endl;
    18     }
    19     ~Child1() {
    20         cout << "我是子类1的析构函数" << endl;
    21     }
    22     class ChildChild {
    23         ChildChild() {
    24             cout << "我是子类的子类的构造函数" << endl;
    25         }
    26         ~ChildChild() {
    27             cout<<"我是子类的子类的析构函数"<<endl;
    28         }
    29     };
    30 };
    31 
    32 
    33 int main()
    34 {
    35     Father *fa = new Child1();
    36     delete fa;
    37     //Child1 ch;
    38     
    39 }

    输出如下:

    我是父类的构造函数
    我是子类1的构造函数
    我是子类1的析构函数
    ~我是父类的析构函数

  • 相关阅读:
    python基础之集合
    python中关于赋值,深浅拷贝
    python小数据池
    python关于解构的例子
    test
    python字典的增,删,改,查
    python中元组常识,以及for 与 range 的用法!
    protobuf.js在长连接中前后台的交互使用方式
    vue-cli的浏览器兼容babel的配置
    前端处理在web打开app功能,有app就打开,没app就提示需要下载直接跳到下载app的页面
  • 原文地址:https://www.cnblogs.com/leoncumt/p/10491810.html
Copyright © 2011-2022 走看看