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