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 }

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

时间: 2024-08-25 04:37:17

c++构造函数析构函数调用顺序的相关文章

c++深/浅拷贝 &amp;&amp; 构造函数析构函数调用顺序练习题

1.深/浅拷贝 编译器为我们提供的合成拷贝构造函数以及合成的拷贝赋值运算符都是浅拷贝.浅拷贝只是做简单的复制,如果在类的构造函数中new出了内存,浅拷贝只会简单的复制一份指向该内存的指针,而不会再开辟内存,这就会使得程序运行出现内存错误,如此,当对象析构的时候,会delete多次同一块内存区域,发生错误.这也就是为什么,必要的时候需要我们自己编写拷贝构造函数和重载赋值运算符,让它变成深拷贝,深拷贝即在copy指针的时候不是简单做值copy,而是还要开辟内存. 2.构造函数析构函数调用顺序练习题

继承中的构造析构函数调用顺序

子类构造函数必须堆继承的成员进行初始化: 1. 通过初始化列表或则赋值的方式进行初始化(子类无法访问父类私有成员) 2. 调用父类构造函数进行初始化 2.1  隐式调用:子类在被创建时自动调用父类构造函数(只能调用父类的无参构造函数和使用默认参数的构造函数) 2.2  显示调用:在初始化列表调用父类构造函数(适用所有的父类构造函数) #include <iostream> #include <string> using namespace std; class PParent //

虚函数析构函数调用顺序

析构函数参考:http://blog.csdn.net/zengchen__acmer/article/details/22592195?utm_source=tuicool构造函数参考:http://www.cnblogs.com/nliao/archive/2012/02/05/2339175.html C++构造函数调用顺序: 1.创建派生类的对象,基类的构造函数函数优先被调用(也优先于派生类里的成员类,多继承时,按照派生表的顺序依次调用): 2.如果类里面有成员类,成员类的构造函数优先被

C++类的继承中构造函数和析构函数调用顺序例子

/*当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止.简而言之,对象是由“底层向上”开始构造的.因为,构造函数一开始构造时,总是要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时,如果无专门说明,就调用直接基类的默认构造函数.在对象析构时,其顺序正好相反.下面的这个程序说明这个问题*///-----------------------------------------------

C++多重继承中构造函数和析构函数调用顺序举例

//多重继承 #include <iostream> using namespace std; class A { public:     A()     {         cout<<"A基类构造A::A()"<<endl;     }     ~A()     {         cout<<"A基类析构A::~A()"<<endl;     } }; class B:public A { publi

构造函数、析构函数调用虚函数

昨天笔试的时候碰到一个很有意思的题目,大体如下: class Parent { public:     Parent()     {         doit();     }     ~Parent()     {         doit();     }     virtual void doit()     {         cout << "I'm Parent!" << endl;     } }; class Child: public Pare

C++中类的构造函数调用顺序

当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止.简而言之,对象是由"底层向上"开始构造的.因为,构造函数一开始构造时,总是要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时,如果无专门说明,就调用直接基类的默认构造函数.在对象析构时,其顺序正好相反. 下面的这个程序说明这个问题 总结下来,我们必须明确的是当一个类继承与基类,并且自身还包含有其他类的成员对象的时候,构造函

C++语言笔记系列之十五——派生类、基类、子对象的构造和析构函数调用关系

例子 example 1 注:若一个基类同时派生出两个派生类,即两个派生类从同一个基类继承,那么系统将为每一个简历副本,每个派生类独立地使用自己的基类副本(比如基类中有属于自己类的静态变量等). #include <iostream.h> class Person { public: person() {cout<<"Construction of person."<<endl;} ~person() {cout<<"Destr

java初始化构造函数调用顺序

类初始化时构造函数调用顺序: (1)初始化对象的存储空间为零或null值:  (2)调用父类构造函数:  (3)按顺序分别调用类成员变量和实例成员变量的初始化表达式:  (4)调用本身构造函数. 例子:public class Dollar extends Money{     Rmb r=new Rmb()     public Dollar(){      System.out.println("Dollar is construct!");     }     public st