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++》