标签:pre exp info 版本 类型 条款09 style 存在 IV
记住:
在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class。
class Transaction { //所有交易的base class public: Transaction(); virtual void logTransaction() const = 0; //做出一份因类型不同而不同的log }; Transaction::Transaction() { ... logTransaction(); } class BuyTransaction: public Transaction { public: virtual void logTransaction() const; ... }; class SellTransaction: public Transaction { public: virtual void logTransaction() const; ... }; BuyTransaction b; //调用的logTransaction是Transaction中的版本,不是BuyTransaction中的。因为base class构造期间,derived class还不存在. //相同道理也适用于析构函数
解决方法
class Transaction { //所有交易的base class public: explicit Transaction(const std::string& logInfo); void logTransaction(const std::string& logInfo) const; ... }; Transaction::Transaction(const std::string& logInfo) { ... logTransaction(logInfo); } class BuyTransaction: public Transaction { public: BuyTransaction(parameters) : Transaction(createLogString(parameters)) { ... } ... private: static std::string createLogString(parameters); };
注意,定义createLogString为static, 避免意外使用BuyTransaction对象内尚未初始化的成员变量。
effective c++ 条款09:绝不在构造和析构过程中调用virtual函数
标签:pre exp info 版本 类型 条款09 style 存在 IV
原文地址:https://www.cnblogs.com/pfsi/p/9170327.html