什么函數(shù)不能聲明為虛函數(shù) 為什么構(gòu)造函數(shù)不能是虛函數(shù)?
為什么構(gòu)造函數(shù)不能是虛函數(shù)?構(gòu)造函數(shù)不能聲明為虛擬函數(shù)的原因是所謂的虛擬函數(shù)在多態(tài)性的情況下只執(zhí)行一個。從繼承的概念來看,總是需要先構(gòu)造父類對象,然后再構(gòu)造子類對象。如果構(gòu)造函數(shù)設(shè)置為虛函數(shù),那么在構(gòu)
為什么構(gòu)造函數(shù)不能是虛函數(shù)?
構(gòu)造函數(shù)不能聲明為虛擬函數(shù)的原因是所謂的虛擬函數(shù)在多態(tài)性的情況下只執(zhí)行一個。從繼承的概念來看,總是需要先構(gòu)造父類對象,然后再構(gòu)造子類對象。如果構(gòu)造函數(shù)設(shè)置為虛函數(shù),那么在構(gòu)造父類構(gòu)造函數(shù)時,必須顯示調(diào)用構(gòu)造。另一個原因是為了防止意外重寫與父類的構(gòu)造函數(shù)相同的子類中的函數(shù),父類的構(gòu)造函數(shù)將被重寫,也就是說,父類的構(gòu)造將不會完成,并且會發(fā)生錯誤。----在子類繼承父類的public方法之后,可以向public添加新的方法和屬性(屬性通常放在private或protect中)。這是正確的繼承的基本用法是虛擬函數(shù)和純虛擬函數(shù)可以在它們的子類中被重寫。它們之間的區(qū)別在于:(1)純虛函數(shù)只有定義,沒有實現(xiàn),虛函數(shù)既有定義又有實現(xiàn)代碼。純虛函數(shù)一般沒有代碼實現(xiàn)部分,如virtual void print()=0,而一般虛函數(shù)必須有代碼實現(xiàn)部分,否則函數(shù)將是未定義的。Virtual void print(){printf(“this is Virtual functionn”)}(2)包含純虛函數(shù)的類不能定義其對象,而包含虛函數(shù)的類可以定義其對象。