3 回答

TA貢獻1818條經驗 獲得超7個贊
從馬的嘴里聽到。:)
來自Bjarne Stroustrup的C ++樣式和技術常見問題解答為什么我們沒有虛擬構造函數?
虛擬調用是一種在給出部分信息的情況下完成工作的機制。特別是,“虛擬”使我們可以調用僅知道任何接口而不知道對象確切類型的函數。要創建對象,您需要完整的信息。特別是,您需要知道要創建的確切類型。因此,“對構造函數的調用”不能是虛擬的。
FAQ條目繼續為代碼提供了一種無需虛擬構造函數即可實現此目的的方法。

TA貢獻1856條經驗 獲得超17個贊
虛函數基本上提供多態行為。即,當您使用動態類型不同于所引用的靜態(編譯時)類型的對象時,它提供的行為適合于對象的實際類型,而不是對象的靜態類型。
現在嘗試將這種行為應用于構造函數。構造對象時,靜態類型始終與實際對象類型相同,因為:
要構造一個對象,構造函數需要創建對象的確切類型。此外,您不能有指向構造函數的指針。
(Bjarne Stroustup(P424 C ++編程語言SE))

TA貢獻1883條經驗 獲得超3個贊
與諸如Smalltalk或Python之類的面向對象的語言不同,構造函數是表示類的對象的虛擬方法(這意味著您不需要GoF 抽象工廠模式,因為您可以傳遞表示類的對象,而無需制作C ++是一種基于類的語言,并且沒有表示該語言任何構造的對象。該類在運行時不作為對象存在,因此您不能在其上調用虛擬方法。
盡管我見過的每個大型C ++項目最終都實現了某種形式的抽象工廠或反射,但這符合“不用為不使用而付出的錢”的理念。
- 3 回答
- 0 關注
- 632 瀏覽
添加回答
舉報