[英]Why passing derived class type as parameter when calling base class copy constructor (C++)?
關於基類的調用復制構造函數,我們有以下形式:
DerivedClass ( const DerivedClass& obj ) : BaseClass ( obj )
{
// ...
}
我只是不明白為什么我們將派生類的對象傳遞給基類復制構造函數。
你還想通過什么? 因為唯一的另一種選擇是從空中召喚出一只神奇的小馬。
這是一個典型的“隱藏在對父母的引用背后的真實類型”的事情。 基類'copy ctor具有簽名base(const base&)
。 如果傳遞最派生類型,半派生類型或基類型,則無關緊。 它只能看到它關心的部分,它是base
,而不是其他任何東西,因此它可以正常工作。
當然,這僅適用於使用公共繼承派生的類型,它們是兩者之間的關系。
它看起來像是對傳遞的類對象的引用,但實際上它將被隱式地提升並且將產生對基類子對象的引用。
有效地,您引用的代碼完全等同於此代碼:
DerivedClass ( const DerivedClass& obj ) :
BaseClass ( static_cast<const BaseClass&>( obj ) )
{
// ...
后一個代碼是完全合理的 - 它通過向已經構造的其他對象的基礎子對象傳遞引用來調用基類子對象構造函數。
派生類的對象具有“派生類的屬性”+“基類的屬性”
當我們想要創建派生類的副本時,我們調用派生類的復制構造函數。 基本上我們想要將“派生類的屬性”+“基類的屬性”復制到新對象。
派生類屬性的副本由派生類復制構造函數處理。 要復制基類的屬性,我們需要顯式調用基類復制構造函數。
如果你沒有,那么基類會從哪里復制?
DerivedClass
是一個 BaseClass
,因此它可以隱式地轉換為對BaseClass
的引用,並在BaseClass
復制構造函數中用於復制。
所以BaseClass(const BaseClass&)
負責復制BaseClass
和DerivedClass(const DerivedClass&)
的成員, DerivedClass
復制DerivedClass
的成員。
這樣做可以避免在從它派生的每個類中復制BaseClass
復制構造函數中的復制代碼,並避免在修改基類時出現破壞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.