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

     1 #include <iostream>
     2 using namespace std;
     3 class A
     4 {
     5     public:
     6     A ()
     7     {
     8         cout<<"A 构造 "<<endl;
     9     } 
    10  virtual  ~A()                    //   定义虚析构函数 导致原来析构顺序发生变化
    11     {
    12         cout<<"A 析构 "<<endl;
    13     }
    14         
    15 };
    16 class B : public A
    17 {
    18     public:
    19         B ()
    20     {
    21         cout<<"B 构造 "<<endl;
    22     }
    23        ~B ()
    24     {
    25         cout<<"B 析构 "<<endl;
    26     }
    27     
    28 };
    29 class C : public B
    30 {
    31     public :
    32     ~C ()
    33     {
    34         cout<<"C 析构 "<<endl;
    35     }
    36     
    37        C ()
    38     {
    39         cout<<"C 构造 "<<endl;
    40     }
    41 };
    42 int main(int argc, char *argv[])
    43 {    
    44     B *b=new C;            //由C的构造函数来创建的对象指针b,这一步会说明析构的b的范围最深到c
    45     delete b;
    46     return 0;
    47 }

    输出结果:

    说明:上面的例子对析构A或者对析构B其中一个或者两个采用虚函数,都会是析构顺序从最深的子类,这个最深由创建对象时候确定,如果

     1 #include <iostream>
     2 using namespace std;
     3 class A
     4 {
     5     public:
     6     A ()
     7     {
     8         cout<<"A 构造 "<<endl;
     9     } 
    10   virtual ~A()
    11     {
    12         cout<<"A 析构 "<<endl;
    13     }
    14         
    15 };
    16 class B : public A
    17 {
    18     public:
    19         B ()
    20     {
    21         cout<<"B 构造 "<<endl;
    22     }
    23        ~B ()
    24     {
    25         cout<<"B 析构 "<<endl;
    26     }
    27     
    28 };
    29 class C : public B
    30 {
    31     public :
    32     ~C ()
    33     {
    34         cout<<"C 析构 "<<endl;
    35     }
    36     
    37        C ()
    38     {
    39         cout<<"C 构造 "<<endl;
    40     }
    41 };
    42 class D : public C
    43 {
    44     public :
    45     ~D ()
    46     {
    47         cout<<"D 析构 "<<endl;
    48     }
    49     
    50        D ()
    51     {
    52         cout<<"D 构造 "<<endl;
    53     }
    54 };
    55 int main(int argc, char *argv[])
    56 {    
    57     B *b=new C;
    58     delete b;
    59     return 0;
    60 }
    View Code

    那么输出结果跟上面的一样

  • 相关阅读:
    【题解】洛谷P4391 [BOI2009] Radio Transmission(KMP)
    【题解】UVA10298 Power String(KMP)
    【题解】洛谷P4281 [AHOI2008] 紧急集合(求三个点LCA)
    [BZOJ4712]洪水-[树链剖分+线段树]
    [BZOJ2961]共点圆-[凸包+cdq分治]
    [BZOJ1185][HNOI2007]最小矩形覆盖-[凸包+旋转卡壳]
    [BZOJ2738]矩阵乘法-[整体二分+树状数组]
    [POJ2104]Kth Number-[整体二分]
    [arc082F]Sandglass
    [arc076F]Exhausted?
  • 原文地址:https://www.cnblogs.com/codeblock/p/4451742.html
Copyright © 2011-2022 走看看