class Transaction{
public:
Transaction(){
logTransaction();
}
virtual void logTransaction()const = 0;//做出一份因类型不同而不同的日志记录
}
class BuyTransaction:public Transaction{
public:
virtual void logTransaction()const;
...
}
class SellTransaction:public Transaction{
public:
virtual void logTransaction()const;
...
}
BuyTransaction b;//构造时调用的是Transaction版本
//构造时子类时先构造基类子对象时,子类并没构造,所以调用基类 析构造时也一样,子类先析构,无法再多态执行子类的重写版本 (调用不会下降至子类)
改进版本:
class Transaction{
public:
explicit Transaction(const string&logInfo){
logTransaction(logInfo);
}
void logTransaction(const string &logInfo)const;
}
class BuyTransaction:public Transaction{
public:
BuyTransaction(parameters):Transaction(createLogString(parameters)){
...
}
private:
static string createLogString(parameters);//静态成员函数避免未构造的情况
}
public:
Transaction(){
logTransaction();
}
virtual void logTransaction()const = 0;//做出一份因类型不同而不同的日志记录
}
class BuyTransaction:public Transaction{
public:
virtual void logTransaction()const;
...
}
class SellTransaction:public Transaction{
public:
virtual void logTransaction()const;
...
}
BuyTransaction b;//构造时调用的是Transaction版本
//构造时子类时先构造基类子对象时,子类并没构造,所以调用基类 析构造时也一样,子类先析构,无法再多态执行子类的重写版本 (调用不会下降至子类)
改进版本:
class Transaction{
public:
explicit Transaction(const string&logInfo){
logTransaction(logInfo);
}
void logTransaction(const string &logInfo)const;
}
class BuyTransaction:public Transaction{
public:
BuyTransaction(parameters):Transaction(createLogString(parameters)){
...
}
private:
static string createLogString(parameters);//静态成员函数避免未构造的情况
}