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

本文介绍了一种改进的交易记录日志实现方式,通过基类接收日志信息并在派生类中构造时传递特定的日志字符串,解决了构造及析构过程中无法正确调用派生类重写方法的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class Transaction{
public:
Transaction(){
logTransaction();
}
virtual void logTransaction()const = 0;//做出一份因类型不同而不同的日志记录

}
class BuyTransaction:public Transaction{
public:
virtual void logTransaction()const;
...
}
class SellTransaction:public Transaction{
public:
virtual void logTransaction()const;
...
}
BuyTransaction b;//构造时调用的是Transaction版本
//构造时子类时先构造基类子对象时,子类并没构造,所以调用基类 析构造时也一样,子类先析构,无法再多态执行子类的重写版本 (调用不会下降至子类)
改进版本:
class Transaction{
public:
explicit Transaction(const string&logInfo){
logTransaction(logInfo);
}
void logTransaction(const string &logInfo)const;
}
class BuyTransaction:public Transaction{
public:
BuyTransaction(parameters):Transaction(createLogString(parameters)){
...
}
private:
static string createLogString(parameters);//静态成员函数避免未构造的情况
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值