zoukankan      html  css  js  c++  java
  • effective c++ 9: Never call virtual functions during construction or destruction

    因为base class的构造函数的执行早于derived class,所以如果在构造函数里调用virtual函数,很可能derived class部分的成员变量还没初始化。并且在derived class对象的base class构造期间,对象是被看做一个base class对象的,所以显然调用virtual函数不会达到想象的效果。

    比较好的方式是把原本在构造函数中调用的virtual函数改为non-virtual,并通过derived lass构造函数传递信息给baseclass构造函数。

    比如:

    class Transaction {
    public:
        explicit Transaction(const std::string& logInfo);
        void logTransaction(const std::string& logInfo) const;
    
        ...
    };
    
    Transaction::Transaction(const std::string& logInfo) {
        ...
        logTransaction(logInfo); //non-virtual call
    }
    
    class BuyTransaction: public Transaction {
    public:
        BuyTransaction( parameters) : Transaction(createLogString(parameters)) {//把log信息传给了base class的构造函数
        ...
    }
    ...
    private:
        static std::string createLogString(parameters);//注意是static,这也避免了derived class对象的成员变量尚未初始化的情况
    };
  • 相关阅读:
    volatile 关键字介绍
    hystrix 线程数,超时时间设置测试
    idea git tag 管理
    wget 认知及常用命令【转载】
    yum 认知及使用
    zuul 性能分析
    java 内存分析
    eureka-8-Eureka 的健康检查
    eureka-7-多网卡下的ip选择
    鼠标拖动div宽/高值增加与减小
  • 原文地址:https://www.cnblogs.com/parapax/p/3649529.html
Copyright © 2011-2022 走看看