1.为什么
#include<iostream>
using namespace std;
class Transaction//交易信息类
{
Transaction();
virtual void logTransaction()const = 0;//交易日志
};
Transaction::Transaction()
{
logTransaction();
}
class BuyTransaction : public Transaction//买入操作
{
virtual void logTransaction()const
{
cout << "BuyTransaction" << endl;
}
};
class SellTransaction : public Transaction//卖出操作
{
virtual void logTransaction()const
{
cout << "SellTransaction" << endl;
}
};
int main()
{
BuyTransaction b;
}
上述代码的本意是,每当进行买入或卖出时,都会创建买入的操作日志或者卖出的操作日志
但是当BuyTransaction对象b创建的时候,会先调用Transaction的构造函数,构造函数去调用logTransaction(),因为这个时候BuyTransaction对象的成员全部未初始化,如果调用BuyTransaction的成员函数,势必要使用BuyTransaction的成员变量,使用未初始化的变量,C++肯定会制止这种行为。
派生类的对象在构造期间是基类,BuyTransaction构造时,当他的专属成分未被初始化的时候,BuyTransaction会被看作Transaction,
2.怎么办
1.将logTransaction()定义为非虚函数
2.将值传给Transaction的构造函数
3.在派生类定义一个静态的函数,把Transaction的构造函数的参数传值给logTransaction(),这样就不会出现未初始化的问题。
class Transaction
{
public:
Transaction( string& s);
void logTransaction(string & s);
};
Transaction::Transaction( string& s)
{
logTransaction(s);
}
class BuyTransaction : public Transaction
{
BuyTransaction(log)
:Transaction(createlogTransaction(log))
{}
private:
static string &createlogTransaction(s)
{
return s;
}
};