曲径通幽论坛

标题: 继承中的构造函数和析构函数的调用顺序 [打印本页]

作者: beyes    时间: 2011-8-27 21:08
标题: 继承中的构造函数和析构函数的调用顺序
基类和派生类都可以包含构造函数和析构函数。我们比较关心的是,当一个派生类的对象被创建或被销毁时,这些构造函数和析构函数的调用顺序如何。

示例程序:
[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 定义中基类从左到右的顺序来调用基类中的构造函数,而析构函数的调用顺序则相反。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2