C++箴言:絕不在構(gòu)造或析構(gòu)期調(diào)用虛函數(shù)

字號:

你不應該在構(gòu)造或析構(gòu)期間調(diào)用虛函數(shù),因為這樣的調(diào)用不會如你想象那樣工作,而且它們做的事情保證會讓你很郁悶。如果你轉(zhuǎn)為 Java 或 C# 程序員,也請你密切關注本文,因為在 C++ 急轉(zhuǎn)彎的地方,那些語言也緊急轉(zhuǎn)了一個彎。
    假設你有一套模擬股票處理的類層次結(jié)構(gòu),例如,購入流程,出售流程等。對這樣的處理來說可以核查是非常重要的,所以隨時會創(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
    ...
    };