ilocker:關注 Android 安全(新手) QQ: 2597294287

 class Transaction { //所有交易的 base class
public:
Transaction();
virtual void logTransaction() const = ; //做出一份因型別不同而不同的日誌記錄

}
Transaction::Transaction() {

logTransaction();
}

derived class:

 class BuyTransaction : public Transaction {
public:
virtual void logTransaction() const;

}
class SellTransaction : public Transaction {
public:
virtual void logTransaction() const;

}

現在執行:

 BuyTransaction b;

derived class 物件內的 base class 部分首先構造,所以 Transaction 建構函式先被呼叫。在 Transaction 建構函式中呼叫的 logTransaction 是 Transaction 的版本,而不是 BuyTransaction 的版本,即使建立的物件型別是 BuyTransaction。

base class 構造期間,virtual 函式絕不會下降到 drived classes 階層,因為此時 drived class 的成員變數尚未初始化,如果 virtual 函式訪問了未初始化的成員變數,就會導致不明確行為,c++ 不允許這種危險操作。

更明確的說:在derived class 物件的 base class 構造期間,物件的型別就是 base class,而不是 derived class,這一點對 RTTI (如 dynamic_cast、typeid) 同樣有效。

同樣的道理,在執行 base class 的解構函式時,derived class 的解構函式已執行完畢,derived class 的成員變數呈現未定義值,c++ 視他們不存在,此時物件就是一個 base class 物件。

在示例中,建構函式直接呼叫了 virtual 函式,此外還應注意建構函式和解構函式有沒有間接呼叫 virtual 函式。

學習資料: 《Effective C++》