美文网首页程序员
[C++进阶]绝不在构造和析构过程中调用virtual函数

[C++进阶]绝不在构造和析构过程中调用virtual函数

作者: 小鱼号的代码日记 | 来源:发表于2020-08-22 16:03 被阅读0次

    当base classes构造函数执行时derived class 的成员变量尚未初始化。如果此期间调用virtual 函数下降至derived class阶层。Derived class 的函数几乎必然取用local成员变量,而那些成员变量尚未初始化。

    Base classes 构造期间virtual函数绝不会下降到dervied classes阶层。

    换句话说:

    在base class 构造期间 virtual函数不是virtual函数

    同样道理也适用于析构函数。

    解决方案:

    不使用virtual函数,然后要求derived class 构造函数传递必要的信息给base class 构造函数。

    总结:

    在构造和析构期间不要调用virtual 函数,因为这类调用从不下降至dervied class

    
    /***************************
    effectivre c++
    改善程序与设计的55个具体做法
    条款8:绝不在构造和析构过程中调用virtual函数
     ---------小鱼号的代码日记--------------
    ****************************/
    
    /*
     应用场景:
       假设有个class继承体系,用来描述交易订单信息。
       每当创建一个交易对象需要创建一个审计日志
    */
    /*
     Base classes 构造期间virtual函数绝不会下降到dervied classes阶层。
    */
    #include <QCoreApplication>
    
    class Transaction
    {
    public:
        Transaction()
        {
          logTransaction();
        }
        virtual void logTransaction() = 0;
    };
    
    class BuyTransaction:public Transaction
    {
    public:
        BuyTransaction()
        {
    
        }
        virtual void logTransaction()
        {
    
        }
    };
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        BuyTransaction b;
        return a.exec();
    }
    
    /***************************
    effectivre c++
    改善程序与设计的55个具体做法
    条款8:绝不在构造和析构过程中调用virtual函数
     ---------小鱼号的代码日记--------------
    ****************************/
    
    /*
     应用场景:
       假设有个class继承体系,用来描述交易订单信息。
       每当创建一个交易对象需要创建一个审计日志
    */
    /*
     Base classes 构造期间virtual函数绝不会下降到dervied classes阶层。
     不使用virtual函数,然后要求derived class 构造函数传递必要的信息给base class 构造函数。
    */
    
    #include <QCoreApplication>
    #include<iostream>
    #include<string>
    using namespace std;
    class Transaction
    {
    public:
        Transaction(const string& logInfo)
        {
          logTransaction(logInfo);
        }
        void logTransaction(const string& logInfo)
        {
            cout << logInfo << endl;
        }
    };
    
    class BuyTransaction:public Transaction
    {
    public:
        BuyTransaction(const string& logInfo)
            :Transaction(createLogInfo(logInfo))
        {
    
        }
    
    private:
        static string createLogInfo(const string& logInfo)
        {
            return logInfo;
        }
    };
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        BuyTransaction b("log....");
        return a.exec();
    }
    

    相关文章

      网友评论

        本文标题:[C++进阶]绝不在构造和析构过程中调用virtual函数

        本文链接:https://www.haomeiwen.com/subject/wruvjktx.html