溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

為什么構(gòu)造函數(shù)不能是虛函數(shù)

發(fā)布時間:2020-09-11 19:45:11 來源:網(wǎng)絡(luò) 閱讀:768 作者:2013221 欄目:編程語言

首先,我寫了一個構(gòu)造函數(shù)用virtual修飾的類A,代碼如下:

class A
{
public:
	virtual A()
	{}
};

運(yùn)行結(jié)果:(我是在VS下運(yùn)行的)

為什么構(gòu)造函數(shù)不能是虛函數(shù)

可以看出這樣的代碼編譯時是有問題的。


為什么構(gòu)造函數(shù)不能是虛函數(shù)呢?

這里你需要知道一個概念,那就是虛函數(shù)表vtbl,每一個擁有虛成員函數(shù)的類都有一個指向虛函數(shù)表的指針。對象通過虛函數(shù)表里存儲的虛函數(shù)地址來調(diào)用虛函數(shù)。

那虛函數(shù)表指針是什么時候初始化的呢?當(dāng)然是構(gòu)造函數(shù)。當(dāng)我們通過new來創(chuàng)建一個對象的時候,第一步是申請需要的內(nèi)存,第二步就是調(diào)用構(gòu)造函數(shù)。試想,如果構(gòu)造函數(shù)是虛函數(shù),那必然需要通過vtbl來找到虛構(gòu)造函數(shù)的入口地址,顯然,我們申請的內(nèi)存還沒有做任何初始化,不可能有vtbl的。因此,構(gòu)造函數(shù)不能是虛函數(shù)。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI