正文
1.關(guān)于構(gòu)造函數(shù)的一個(gè)違反直覺的行為
我會(huì)以重復(fù)標(biāo)題開始:你不應(yīng)該在構(gòu)造或者析構(gòu)的過程中調(diào)用虛函數(shù),因?yàn)檫@些調(diào)用的結(jié)果會(huì)和你想的不一樣。如果你同時(shí)是一個(gè)java或者c#程序員,那么請(qǐng)著重注意這個(gè)條款,因?yàn)檫@是c++同它們不一樣的地方。
假設(shè)你已經(jīng)有一個(gè)為股票交易建模的類繼承體系,它可以買賣股票等。這些交易的可審計(jì)性很重要,所以每次交易對(duì)象被創(chuàng)建的時(shí)候,需要在審計(jì)日志中創(chuàng)建一個(gè)合適的記錄。這看上去是解決問題的合理方法:
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