Effective C++ T09:绝不在构造和析构过程中调用virtual函数

38 篇文章 0 订阅
31 篇文章 2 订阅

Effective C++学习笔记总链接

改善程序与设计的55个具体做法学习笔记-每日1条


条款09:绝不在构造和析构过程中调用virtual函数

【技巧】

在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class(比起当前执行构造函数和析构函数的那层)


class Transaction // 所有交易的base class
{
public:
	Transaction();
	virtual void logTransaction() const = 0; // 做一份因类型不同而不同的日志记录(log entry)
};
Transaction::Transaction()
{
	logTransaction();
}
class BuylogTransaction: public logTransaction // derived class
{
	virtual void logTransaction() const;
};

...
BuylogTransaction b; // 执行会发生什么事?

无疑会有个BuylogTransaction 构造函数被调用,但首先Transaction构造函数一定会被调用。
Transaction构造函数会执行virtual函数 logTransaction,但调用的是Transaction::logTransaction(),而不是BuylogTransaction ::logTransaction()。

base class构造期间virtual函数绝不会下降到derived class阶层

或者说是,在base class 构造期间,virtual函数不是virtual 函数。

原因】:由于base class构造函数执行更早于derived class构造函数,当base class构造函数执行时derived class的成员变量尚未初始化

根本原因】:在derived class对象的base class 构造期间,对象的类型是base class 而不是derived class。virtual虚函数(或者运行期类型信息(dynamic_cast 条款27和typeid))会被编译器解析至base class类型

对象在derived class构造函数开始执行前不会成为一个derived class对象。

相同的道理也适用于析构函数。

换句话说,由于你无法使用virtual函数从base class 向下调用, 在构造期间,你可以藉由“令derived class 将必要的构造信息向上传递至 base class 构造函数” 替换之二加以弥补。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值