首先,我寫了一個(gè)構(gòu)造函數(shù)用virtual修飾的類A,代碼如下:
創(chuàng)新互聯(lián)自2013年創(chuàng)立以來,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元亞東做網(wǎng)站,已為上家服務(wù),為亞東各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575
class A { public: virtual A() {} };
運(yùn)行結(jié)果:(我是在VS下運(yùn)行的)
可以看出這樣的代碼編譯時(shí)是有問題的。
為什么構(gòu)造函數(shù)不能是虛函數(shù)呢?
這里你需要知道一個(gè)概念,那就是虛函數(shù)表vtbl,每一個(gè)擁有虛成員函數(shù)的類都有一個(gè)指向虛函數(shù)表的指針。對象通過虛函數(shù)表里存儲的虛函數(shù)地址來調(diào)用虛函數(shù)。
那虛函數(shù)表指針是什么時(shí)候初始化的呢?當(dāng)然是構(gòu)造函數(shù)。當(dāng)我們通過new來創(chuàng)建一個(gè)對象的時(shí)候,第一步是申請需要的內(nèi)存,第二步就是調(diào)用構(gòu)造函數(shù)。試想,如果構(gòu)造函數(shù)是虛函數(shù),那必然需要通過vtbl來找到虛構(gòu)造函數(shù)的入口地址,顯然,我們申請的內(nèi)存還沒有做任何初始化,不可能有vtbl的。因此,構(gòu)造函數(shù)不能是虛函數(shù)。