当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();
}
网友评论