曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3302|回复: 0
打印 上一主题 下一主题

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

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2011-8-27 21:08:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基类和派生类都可以包含构造函数和析构函数。我们比较关心的是,当一个派生类的对象被创建或被销毁时,这些构造函数和析构函数的调用顺序如何。

示例程序:
[C++] 纯文本查看 复制代码
#include <iostream>
using namespace std;

class base {
public:
    base() { cout << "Constructing base\n"; }
    ~base() { cout << "Desconstructing base\n"; }
};

class derived: public base {
public:
    derived() { cout << "Constructing derived\n"; }
    ~derived() { cout << "Desconstructing derived\n"; }
};

int main()
{
    derived ob;

    return 0;
}

运行输出:
$ ./inheritcon
Constructing base
Constructing derived
Desconstructing derived
Desconstructing base
从输出可以看出,base 的结构函数首先被执行,然后是 derived 的构造函数;在销毁时,先执行 derived 的析构函数,然后是 base 的析构函数。

所以,构造函数以派生的顺序进行调用,析构函数则以相反的顺序进行调用。

上述的调用规则也适用于多重继承的情况,如下程序示例:
[C++] 纯文本查看 复制代码
#include <iostream>
using namespace std;

class base1 {
public:
    base1() { cout << "Constructing base1\n"; }
    ~base1() { cout << "Destructing base1\n"; }
};

class base2 {
public:
    base2() { cout << "Constructing base2\n"; } 
    ~base2() { cout << "Destructing base2\n"; }
};

class derived: public base1, public base2 {
public:
    derived() { cout << "Constructing derived\n"; }
    ~derived() { cout << "Destructing derived\n"; }
};

int main()
{
    derived ob;

    return 0;
}

运行输出:
$ ./mulincon
Constructing base1
Constructing base2
Constructing derived
Destructing derived
Destructing base2
Destructing base1
从输出结果可以看到,构造函数是按照类 derived 定义中基类从左到右的顺序来调用基类中的构造函数,而析构函数的调用顺序则相反。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-21 12:16 , Processed in 0.078450 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表