Effective C++學習筆記總鏈接
改善程式與設計的55個具體做法學習筆記-每日1條
條款09:絕不在構造和析構程序中呼叫virtual函式
【技巧】
在構造和析構期間不要呼叫virtual函式,因為這類呼叫從不下降至derived class(比起當前執行建構式和解構式的那層)
class Transaction // 所有交易的base class
{
public:
Transaction();
virtual void logTransaction() const = 0; // 做一份因型別不同而不同的日志記錄(log entry)
};
Transaction::Transaction()
{
logTransaction();
}
class BuylogTransaction: public logTransaction // derived class
{
virtual void logTransaction() const;
};
...
BuylogTransaction b; // 執行會發生什么事?
無疑會有個BuylogTransaction 建構式被呼叫,但首先Transaction建構式一定會被呼叫,
Transaction建構式會執行virtual函式 logTransaction,但呼叫的是Transaction::logTransaction(),而不是BuylogTransaction ::logTransaction(),
base class構造期間virtual函式絕不會下降到derived class階層
或者說是,在base class 構造期間,virtual函式不是virtual 函式,
【原因】:由于base class建構式執行更早于derived class建構式,當base class建構式執行時derived class的成員變數尚未初始化,
【根本原因】:在derived class物件的base class 構造期間,物件的型別是base class 而不是derived class,virtual虛函式(或者運行期型別資訊(dynamic_cast 條款27和typeid))會被編譯器決議至base class型別,
物件在derived class建構式開始執行前不會成為一個derived class物件,
相同的道理也適用于解構式,
換句話說,由于你無法使用virtual函式從base class 向下呼叫, 在構造期間,你可以藉由“令derived class 將必要的構造資訊向上傳遞至 base class 建構式” 替換之二加以彌補,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/255939.html
標籤:區塊鏈
