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的析构函数
    ~我是父类的析构函数

  • 相关阅读:
    java中Logger.getLogger(Test.class),即log4日志的使用
    System.getProperty()方法大全 (转载)
    常用MySQL函数
    MYSQL常用命令(转载)
    Oracle中与日期时间有关的运算函数
    R
    珍惜现在,感恩生活 多重背包
    Piggy-Bank 完全背包
    骨骼收集器01背包
    D
  • 原文地址:https://www.cnblogs.com/leoncumt/p/10491810.html
Copyright © 2011-2022 走看看