zoukankan      html  css  js  c++  java
  • 条款9:绝不在构造和析构过程中调用virtual函数

    //一种错误的方式:在基类的构造函数中去调用virtual函数
    #include<iostream>
    using namespace std;
    
    #if 0
    class Transcation
    {
    public:
        Transcation()
        {
            //...
            logTran();
        }
        ~Transcation()
        {}
    
        virtual void logTran() = 0;
    };
    
    class BuyTranscation : public Transcation
    {
        void logTran()
        {
            //...
            cout << "this is BuyTranscation's ctor";
        }
    };
    
    int main()
    {
        BuyTranscation bt;    //不能够在构造函数中调用virtual函数,因为此时它并没有指向具体的函数
        return 0;
    }
    
    #else
    
    //一种好的做法是将Log函数改为non-virtual,然后要求子类ctor传递必要的信息给到Trans的构造函数.这样仍然实现了在父类的构造函数中调用Log函数,并且不会存在问题.
    class Trans
    {
    public:
        Trans(string param)
        {
            string str = "Trans Speaks:";
            cout << (str + param).c_str() << endl;
            LogTrans();
        }
    
        void LogTrans()
        {
            cout << "##########Log###########" << endl;
        }
    };
    
    class BuyTrans : public Trans
    {
    public:
        BuyTrans(string param) : Trans(CreateLog(param))    //在子类构造函数执行之前就让基类构造函数进行执行.
        {
        }
    
    private:
        static string CreateLog(string param)
        {
            string str = "Hello, this is: ";
            return str + param;
        }
    };
    
    int main()
    {
        BuyTrans btt("btt");
        return 0;
    }
    
    #endif
    新战场:https://blog.csdn.net/Stephen___Qin
  • 相关阅读:
    关于代码手写UI,xib和StoryBoard
    封装自己的framework静态库
    AsyncDisplayKit
    RunLoop
    AFNetworking2.0源码解析<三>
    AFNetworking2.0源码解析<四>
    AFNetworking2.0源码解析<二>
    AFNetworking2.0源码解析<一>
    多线程
    Mac svn 命令
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/12242513.html
Copyright © 2011-2022 走看看