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;}
};