继承和组合混搭的情况下,构造和析构函数的调用顺序

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

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

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

例如下面一段代码:

 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

原文地址:https://www.cnblogs.com/jswu-ustc/p/8386278.html

时间: 2024-10-06 21:01:44

继承和组合混搭的情况下,构造和析构函数的调用顺序的相关文章

EC笔记,第二部分:9.不在构造、析构函数中调用虚函数

9.不在构造.析构函数中调用虚函数 1.在构造函数和析构函数中调用虚函数会产生什么结果呢? #include <iostream> using namespace std; class cls1{ public: cls1(){ newMake(); }; ~cls1(){ deleteIt(); }; virtual void newMake(){ cout<<"cls1 make"<<endl; } virtual void deleteIt()

绝不在构造和析构函数中调用 virtual 函数

看下面的这段代码,问 print调用的是基类还是派生类的版本? 答案是 基类... 可能大家会很惊讶,print不是virtual function 吗?为什么不是调用派生类的版本呢? 首先,当定义一个派生类的对象的时候, 由于 base class 构造函数的执行更早于 derived class构造函数, 所以当 base class constructor 调用的时候,派生类的成员尚未初始化(说明,这个时候真正的 虚函数表尚未完全初始化). 如果这个时候调用 派生类的函数(可能使用未初始化

关于setInterval:如果你在不刷新页面的情况下,再次点击调用setInterval的按钮会怎样?

模仿教程做了一个倒计时的小页面,代码如下: 1 <html> 2 <head> 3 <title> 4 5 </title> 6 <style> 7 8 </style> 9 10 </head> 11 <body> 12 <form id="inputArea"> 13 请输入分钟数<input type="text" value="请输入数

条款9:绝不要在构造以及析构函数中调用虚函数

在构造以及析构函数期间不要调用virtual函数,因为这类调用从不下降到derived class中.例如说下面这个例子: 1 class Transaction{ 2 public: 3 Transaction(); 4 virtual void logTransactions()s const = 0; 5 //... 6 }; 7 Transaction::Transaction() 8 { 9 //... 10 logTransaction(); 11 } 12 class BuyTra

有return的情况下try catch finally的执行顺序

http://www.cnblogs.com/lanxuezaipiao/p/3440471.html?cm_mc_uid=89442383850615035911861&cm_mc_sid_50200000=1505491196 1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么

有return的情况下try catch finally的执行顺序(最有说服力的总结)

结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的:4.finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值.举例:情况1:try{}

有return的情况下try catch finally的执行顺序(转)

结论: 1.不管有木有出现异常,finally块中代码都会执行: 2.当try和catch中有return时,finally仍然会执行: 3.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的: 4.finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值. 举例: 情况1

有return的情况下try catch finally的执行顺序(转)

结论:1.不管有没有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的:4.finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值.举例:情况1:try{

[转]有return的情况下try catch finally的执行顺序

结论: 1.不管有没有出现异常,finally块中代码都会执行: 2.当try和catch中有return时,finally仍然会执行: 3.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的: 4.finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值. 举例: 情况