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

记住:
在构造和析构期间不要调用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对象内尚未初始化的成员变量。

猜你喜欢

转载自www.cnblogs.com/pfsi/p/9170327.html