c++ 千萬不要在構造或者析構中調用 virtual函數

參考 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函數 , 因爲他不會從父類的這層虛函數下降至子類的虛函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章