//一种错误的方式:在基类的构造函数中去调用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函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这篇关于条款9:绝不在构造和析构过程中调用virtual函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!