【发布时间】:2014-11-17 18:59:46
【问题描述】:
我知道这个问题有明确的答案:首先调用基类构造函数,然后调用派生类构造函数。
但我不完全理解“被称为”这个词。是指构造函数的开始使用,还是构造函数的使用结束?换句话说,下面的代码有两种可能的顺序:
BaseClass 构造函数启动 -> BaseClass 构造函数完成 -> DerivedClass 构造函数启动 -> DerivedClass 构造函数完成。
DerivedClass 构造函数启动 -> BaseClass 构造函数启动 -> BaseClass 构造函数完成 -> DerivedClass 构造函数完成。
哪一个应该是正确的顺序?如果 1 是正确的,编译器怎么知道在我们初始化 DerivedClass 实例之前调用 BaseClass 构造函数?
似乎情况2是正确的:“调用”应该意味着构造函数的完成。一个后续问题是析构函数怎么样?我知道标准答案是“首先调用派生类的析构函数”。那么正确的顺序是:
- DerivedClass 析构函数启动
- DerivedClass 析构函数完成
- BaseClass 析构函数启动
- BaseClass 析构函数完成
谢谢
class BaseClass {
public:
BaseClass() {
cout << "BaseClass constructor." << endl;
}
};
class DerivedClass : public BaseClass {
public:
DerivedClass() : BaseClass() {
cout << "DerivedClass constructor." << endl;
}
};
int main() {
DerivedClass dc;
}
【问题讨论】:
-
你为什么不运行程序并找出答案?
-
试试看,一个重要的座右铭;)。
-
如果 2 是正确的,那么派生类构造函数中的 where 究竟会不会“注入”基类构造函数?编译器将如何做出该决定?
-
这实际上是一个有趣的问题:由于派生类的构造函数可以在某个翻译单元 A 中定义,而该类型的对象可以在另一个 B 中构造,编译器不会知道 B 中的哪个基如果有几个要调用的类ctor。也就是说,必须在调用基类 ctor 之前使用派生类 ctor 的 一些 部分。
-
运行代码,查看消息的顺序。
标签: c++ constructor derived-class base-class