虛函數(shù)與純虛函數(shù) 為什么構(gòu)造函數(shù)不能是虛函數(shù)?
為什么構(gòu)造函數(shù)不能是虛函數(shù)?構(gòu)造函數(shù)不能聲明為虛擬函數(shù)的原因是所謂的虛擬函數(shù)在多態(tài)性的情況下只執(zhí)行一個(gè)。從繼承的概念來(lái)看,總是需要先構(gòu)造父類(lèi)對(duì)象,然后再構(gòu)造子類(lèi)對(duì)象。如果構(gòu)造函數(shù)設(shè)置為虛函數(shù),那么在構(gòu)
為什么構(gòu)造函數(shù)不能是虛函數(shù)?
構(gòu)造函數(shù)不能聲明為虛擬函數(shù)的原因是所謂的虛擬函數(shù)在多態(tài)性的情況下只執(zhí)行一個(gè)。從繼承的概念來(lái)看,總是需要先構(gòu)造父類(lèi)對(duì)象,然后再構(gòu)造子類(lèi)對(duì)象。如果構(gòu)造函數(shù)設(shè)置為虛函數(shù),那么在構(gòu)造父類(lèi)構(gòu)造函數(shù)時(shí),必須顯示調(diào)用構(gòu)造。另一個(gè)原因是為了防止意外重寫(xiě)與父類(lèi)的構(gòu)造函數(shù)相同的子類(lèi)中的函數(shù),父類(lèi)的構(gòu)造函數(shù)將被重寫(xiě),也就是說(shuō),父類(lèi)的構(gòu)造將不會(huì)完成,并且會(huì)發(fā)生錯(cuò)誤。----在子類(lèi)繼承父類(lèi)的public方法之后,可以向public添加新的方法和屬性(屬性通常放在private或protect中)。這是正確的,似乎環(huán)境是MSVC。如果目標(biāo)文件中有一個(gè)符號(hào)表,實(shí)際上,最直觀的方法是轉(zhuǎn)到符號(hào)表,找出與修改后的構(gòu)造函數(shù)名稱(chēng)相對(duì)應(yīng)的地址項(xiàng)。如何操作取決于主體需要在什么條件下找到地址去做。
構(gòu)造函數(shù)為什么不可以聲明為虛函數(shù)?
不要在構(gòu)造函數(shù)中調(diào)用虛擬函數(shù)。在基類(lèi)的構(gòu)造中,虛函數(shù)是非虛函數(shù),不會(huì)進(jìn)入派生類(lèi)。它是一個(gè)靜態(tài)綁定。很明顯,當(dāng)我們構(gòu)造對(duì)象的子類(lèi)時(shí),我們調(diào)用基類(lèi)的構(gòu)造函數(shù)并構(gòu)造子類(lèi)的基類(lèi)部分。子類(lèi)尚未構(gòu)造且尚未初始化。如果在基類(lèi)的構(gòu)造中調(diào)用虛函數(shù),如果可能的話(huà),調(diào)用一個(gè)尚未初始化的對(duì)象是非常危險(xiǎn)的,所以在構(gòu)造父類(lèi)對(duì)象的部分時(shí),不允許調(diào)用子類(lèi)的虛函數(shù)實(shí)現(xiàn)。但這并不意味著你不能寫(xiě)這樣的程序
構(gòu)造函數(shù)的左右兩邊是初始化變量的值等等。VC的語(yǔ)法是只要用戶(hù)定義了構(gòu)造函數(shù),系統(tǒng)就不會(huì)提供任何構(gòu)造函數(shù)。如果將其定義為虛擬函數(shù),則程序無(wú)法在開(kāi)始時(shí)初始化變量,也無(wú)法應(yīng)用內(nèi)存空間,程序也無(wú)法運(yùn)行