码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-06-11 22:45:20      阅读:277      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!