C++箴言:絕不在構造或析構期調用虛函數(shù)

字號:

你不應該在構造或析構期間調用虛函數(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
    ...
    };