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

class Transaction
{
public:Transaction();
virtual void logTransaction() const=0;
...
}
Transaction::Transaction()
{
...
logTransaction();
}

class BuyTransaction:public Transaction
{
public:
virtual void logTransaction()const;
}
BuyTransaction b;

以上代码在基类构造函数里面使用了虚函数,我们本来的想法是,继承函数BuyTransaction在构造时,继承了基类的构造函数,所以相当于在构造函数内部调用了BuyTransaction中的重写的logTransaction函数,但是事实却不是这样的,因为BuyTransaction的构造函数首先先调用基类Transaction的构造函数,而基类的构造函数实现前,BuyTransaction根本就不存在(没构造出来)所以就没有BuyTransaction中的重写的logTransaction函数,所以系统会默认调用基类的那个logTransaction函数。

同理也不能在析构函数中这么做,因为析构函数首先调用基类的析构函数,而这时继承类的函数会被当做不存在而不会被析构。

注意:也不能将虚函数包装在非虚函数里面然后再在构造和析构函数里面调用。

解决方案:在class Transaction内将logTransaction函数改为non-virtual ,然后derived class 构造函数传递必要信息给Transaction构造函数,而后那个构造函数便可以安全的调用non-virtual logTranaction.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值