正文
1.關(guān)于構(gòu)造函數(shù)的一個違反直覺的行為
我會以重復(fù)標(biāo)題開始:你不應(yīng)該在構(gòu)造或者析構(gòu)的過程中調(diào)用虛函數(shù),因為這些調(diào)用的結(jié)果會和你想的不一樣。如果你同時是一個java或者c#程序員,那么請著重注意這個條款,因為這是c++同它們不一樣的地方。
假設(shè)你已經(jīng)有一個為股票交易建模的類繼承體系,它可以買賣股票等。這些交易的可審計性很重要,所以每次交易對象被創(chuàng)建的時候,需要在審計日志中創(chuàng)建一個合適的記錄。這看上去是解決問題的合理方法:
1 class Transaction { // base class for all 2 3 public: // transactions 4 5 Transaction(); 6 7 virtual void logTransaction() const = 0; // make type-dependent 8 9 // log entry10 11 ...12 13 };14 15 Transaction::Transaction() // implementation of16 17 { // base class ctor18 19 ...20 21 logTransaction(); // as final action, log this22 23 } // transaction24 25 class BuyTransaction: public Transaction { // derived class26 27