參考 effective c++
假設我們寫個模擬股市交易的類
這個類每創建一個對象 都必須寫一個log
我們實現了個抽象類 因爲不同的交易信息不同的log
class Transaction
{
public:
Transaction()
{
log();
}
virtual void log()const = 0;
};
class BuyTransaction :public Transaction
{
public:
virtual void log()const;
};
當我們執行
BuyTransaction buy;
會出現什麼問題?
首先 編譯器知道這樣很危險 編譯器是編譯不過的 因爲我們的 virtual 沒有實現 所以在構造裏不能調用
但是我們可以在上面封一層這樣編譯器就檢測不出來了,比如下面
class Transaction
{
public:
Transaction()
{
init();
};
void init()
{
log();
}
virtual void log()const = 0;
};
class BuyTransaction :public Transaction
{
public:
virtual void log() const {};
};
加個init 函數 裏面調用 log 虛函數 構造時調用 init 函數
這樣執行會怎麼樣呢?
首先會調用父類的構造 然後 就會調用父類的log 這裏就會出問題了!
這是調用的是父類的 log 還是 子類的log 函數呢?
雖然我們聲明的是子類的對象 但是還是調用的父類的log 這裏就很危險了
可能讓你通宵調試
直接就崩潰了 還要感謝編譯器
你聲明一個子類對象 如果正常的運行 可能讓你通宵調試 哈哈哈
記住:
千萬不要在構造或者析構中調用 virtual函數 , 因爲他不會從父類的這層虛函數下降至子類的虛函數