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

Posted 禾田守望者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了条款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

 

以上是关于条款9:绝不在构造和析构过程中调用virtual函数的主要内容,如果未能解决你的问题,请参考以下文章

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

NO.8:绝不在构造或者析构过程中调用virtual函数

2.构造,析构,赋值运算--条款09-12

条款09:不要在构造过程和析构过程中调用 virtual 方法

条款09:不要在构造过程和析构过程中调用 virtual 方法

绝不在构造函数和析构函数中调用虚函数