Item 9: Never call virtual functions during construction or destruction.
在构造和析构期间不要调用 virtual
函数,因为这类调用不会下降至 derived class
(比起当前执行构造函数和析构函数的那层)。
1 | class Transaction { // base class for all |
b
在构造时,调用到父类Transaction的构造函数,其中对 logTransaction
的调用会被解析到 Transaction
类。 那是一个纯虚函数,因此程序会非正常退出。
在derived class
对象的 base class
构造期间,对象的类型是 base class
而不是 derived classo
不只 virtual
函数会被编译器解析至(resolve to) base class
,若使用运行期类型信息 RTTI
(runtime type information, 例如 dynamic_cast
typeid
) ,也会把对象视为 base class
类型。
1 | class Transaction{ |
输出
1 | P11Transaction |
相同道理也适用于析构函数.