码迷,mamicode.com
首页 > 其他好文 > 详细

条款9:绝不在构造和析构过程中调用virtual函数

时间:2020-01-30 14:06:36      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:信息   div   col   int   rtu   names   include   cto   tran   

//一种错误的方式:在基类的构造函数中去调用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

 

条款9:绝不在构造和析构过程中调用virtual函数

标签:信息   div   col   int   rtu   names   include   cto   tran   

原文地址:https://www.cnblogs.com/Stephen-Qin/p/12242513.html

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