zoukankan      html  css  js  c++  java
  • 继承和组合混搭的情况下,构造和析构函数的调用顺序

    继承和组合混搭的情况下:

            构造时,先调用父类的构造函数(如果父类还有父类,先执行父类的父类的构造函数,在执行父类的构造函数),再调用组合对象的构造函数,最后调用自己的构造函数;

            析构时,先调用自己的析构函数,再调用组合对象的析构函数,最后调用父类的析构函数(如果父类还有父类,先执行父类的析构函数,再执行父类的父类的析构函数)。

    例如下面一段代码:

     1 #include<iostream>
     2 using namespace std;
     3 
     4 class Object
     5 {
     6 public:
     7     Object(int _x,int _y):x(_x),y(_y){cout<<"Object的构造函数"<<x<<" "<<y<<endl;}
     8     ~Object(){cout<<"Object的析构函数"<<x<<" "<<y<<endl;}
     9 
    10 private:
    11     int x;
    12     int y;
    13 };
    14 
    15 
    16 
    17 
    18 class Parent:public Object
    19 {
    20 public:
    21     Parent(int _a,int _b):Object(1,2),a(_a),b(_b){cout<<"Parent的构造函数"<<endl;}
    22     ~Parent(){cout<<"Parent的析构函数"<<endl;}
    23 
    24 private:
    25     int a;
    26     int b;
    27 };
    28 
    29 class Child:public Parent
    30 {
    31 public:
    32     Child(int _a,int _b,int _c):Parent(_a,_b),obj(3,4),c(_c)
    33     {
    34         cout<<"Child的构造函数"<<endl;
    35     }
    36     ~Child(){cout<<"Child的析构函数"<<endl;}
    37 
    38 protected:
    39     Object obj;
    40 
    41 private:
    42     int c;
    43 };
    44 
    45 int main()
    46 {
    47     Child c(1,2,3);
    48 
    49     return 0;
    50 }

    代码的执行结果是:

       Object的构造函数1  2

       Parent的构造函数

       Object的构造函数3  4

       Child的构造函数

       Child的析构函数

       Object的析构函数3  4

       Parent的析构函数

       Object的析构函数1  2

  • 相关阅读:
    关于根据索引 删除队
    Vs 2012 编译C 语言
    动态绑定 dgvlist 列
    自定义控件闪烁问题
    程序员都不读书,但你应该读
    对于委托的理解 委托和事件
    ​label 中 文字的位置
    vs2010 折叠C/c++中的if
    关于动态创建控件性能提高 以及 SuspendLayout & ResumeLayout 的使用
    c# WinForm开发 DataGridView控件的各种操作总结(单元格操作,属性设置)
  • 原文地址:https://www.cnblogs.com/jswu-ustc/p/8386278.html
Copyright © 2011-2022 走看看