C/C++編程筆記:高級C++知識 | 虛擬構(gòu)造器
我們可以在C ++中使類構(gòu)造函數(shù)虛擬化以創(chuàng)建多態(tài)對象嗎?不會。C++是靜態(tài)類型的(RTTI的目的有所不同)語言,對于C ++編譯器來說,多態(tài)創(chuàng)建對象是沒有意義的。編譯器必須知道創(chuàng)建對象的類類型。換句話說,從C ++編譯器的角度來看,要創(chuàng)建哪種類型的對象是編譯時的決定。如果我們將構(gòu)造函數(shù)設(shè)為虛擬,則編譯器會標(biāo)記錯誤。實際上,除了inline之外,構(gòu)造函數(shù)的聲明中不允許其他關(guān)鍵字。

在實際情況下,我們需要基于一些輸入在類層次結(jié)構(gòu)中創(chuàng)建派生類對象。換句話說,對象創(chuàng)建和對象類型緊密耦合,這迫使修改擴(kuò)展。虛擬構(gòu)造器的目的是使對象創(chuàng)建與類型脫鉤。
我們?nèi)绾卧谶\行時創(chuàng)建所需的對象類型?例如,請參見下面的示例程序。
在以上示例中,假定層次結(jié)構(gòu)Base,Derived1和Derived2是庫代碼的一部分。User類是試圖利用層次結(jié)構(gòu)的實用程序類。的主要功能是消耗基地經(jīng)由層級的功能?的用戶?類。
該用戶類構(gòu)造函數(shù)創(chuàng)建Derived1對象,始終。如果用戶的使用者(在我們的例子中是主要用戶)需要Derived2功能,則用戶需要創(chuàng)建“?new Derived2()?”并強(qiáng)制重新編譯。重新編譯是不好的設(shè)計方法,因此我們可以選擇以下方法。
在詳細(xì)介紹之前,讓我們回答一下,誰將指示創(chuàng)建Derived1或Derived2對象?顯然,它是User類的使用者。該用戶類可以使用的if-else梯的創(chuàng)建或者Derived1或Derived2的,如下面的示例所示:
上面的代碼*不*開放擴(kuò)展,這是一種不靈活的設(shè)計。簡而言之,如果庫使用新類Derived3更新基類層次結(jié)構(gòu)。User類如何創(chuàng)建Derived3對象?一種方法是更新基于新輸入ID 3來創(chuàng)建Derived3對象的if-else階梯,如下所示,
上面的修改迫使User類的用戶重新編譯,不好的(不靈活的)設(shè)計!并且不會因基礎(chǔ)擴(kuò)展而關(guān)閉用戶類的進(jìn)一步修改。
問題在于對象的創(chuàng)建。將新類添加到層次結(jié)構(gòu)中,從而強(qiáng)制重新編譯User類的依賴項。我們不能將創(chuàng)建對象的操作委托給類層次結(jié)構(gòu)本身或虛擬行為的函數(shù)嗎?通過將對象創(chuàng)建委托給類層次結(jié)構(gòu)(或靜態(tài)函數(shù)),我們可以避免User和Base層次結(jié)構(gòu)之間的緊密耦合。理論足夠,請參見以下代碼,
該用戶類是獨立的對象創(chuàng)建的。它將責(zé)任委托給Base,并以ID的形式提供輸入。如果庫添加了新的類Derived4,則庫修改器將擴(kuò)展Create內(nèi)的if-else梯形圖以返回正確的對象。消費者用戶不需要重新編譯他們的代碼由于延長基地。
請注意,函數(shù)Create用于在運行時返回不同類型的基類對象。它的作用類似于虛擬構(gòu)造函數(shù),在模式術(shù)語中也稱為Factory Method。
模式世界展示了實現(xiàn)上述概念的不同方法。
以上就是今天的全部內(nèi)容了。每日分享小知識,希望對你有幫助~
另外如果你想更好的提升你的編程能力,學(xué)好C語言C++編程!彎道超車,快人一步!筆者這里或許可以幫到你~
微信公眾號:C語言編程學(xué)習(xí)基地
分享(源碼、項目實戰(zhàn)視頻、項目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!
