基类和派生类都可以包含构造函数和析构函数。我们比较关心的是,当一个派生类的对象被创建或被销毁时,这些构造函数和析构函数的调用顺序如何。
示例程序:
[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 定义中基类从左到右的顺序来调用基类中的构造函数,而析构函数的调用顺序则相反。 |