你不應該在構造或析構期間調用虛函數(shù),因為這樣的調用不會如你想象那樣工作,而且它們做的事情保證會讓你很郁悶。如果你轉為 Java 或 C# 程序員,也請你密切關注本文,因為在 C++ 急轉彎的地方,那些語言也緊急轉了一個彎。
假設你有一套模擬股票處理的類層次結構,例如,購入流程,出售流程等。對這樣的處理來說可以核查是非常重要的,所以隨時會創(chuàng)建一個 Transaction 對象,將這個創(chuàng)建記錄在核查日志中是一個適當?shù)囊?。下面是一個看起來似乎合理的解決問題的方法:
class Transaction { // base class for all
public: // transactions
Transaction();
virtual void logTransaction() const = 0; // make type-dependent
// log entry
...
};
Transaction::Transaction() // implementation of
{
// base class ctor
...
logTransaction(); // as final action, log this
} // transaction
class BuyTransaction: public Transaction {
// derived class
public:
virtual void logTransaction() const; // how to log trans-
// actions of this type
...
};
class SellTransaction: public Transaction {
// derived class
public:
virtual void logTransaction() const; // how to log trans-
// actions of this type
...
};
假設你有一套模擬股票處理的類層次結構,例如,購入流程,出售流程等。對這樣的處理來說可以核查是非常重要的,所以隨時會創(chuàng)建一個 Transaction 對象,將這個創(chuàng)建記錄在核查日志中是一個適當?shù)囊?。下面是一個看起來似乎合理的解決問題的方法:
class Transaction { // base class for all
public: // transactions
Transaction();
virtual void logTransaction() const = 0; // make type-dependent
// log entry
...
};
Transaction::Transaction() // implementation of
{
// base class ctor
...
logTransaction(); // as final action, log this
} // transaction
class BuyTransaction: public Transaction {
// derived class
public:
virtual void logTransaction() const; // how to log trans-
// actions of this type
...
};
class SellTransaction: public Transaction {
// derived class
public:
virtual void logTransaction() const; // how to log trans-
// actions of this type
...
};