關於在基類的調用拷貝構造函數,我們有如下形式:爲什麼在調用基類複製構造函數(C++)時將派生類類型作爲參數傳遞?
DerivedClass (const DerivedClass& obj) : BaseClass (obj)
{
// ...
}
我只是不明白,爲什麼我們通過派生類對象的基類的拷貝構造函數。
關於在基類的調用拷貝構造函數,我們有如下形式:爲什麼在調用基類複製構造函數(C++)時將派生類類型作爲參數傳遞?
DerivedClass (const DerivedClass& obj) : BaseClass (obj)
{
// ...
}
我只是不明白,爲什麼我們通過派生類對象的基類的拷貝構造函數。
你還想要傳遞什麼?因爲唯一的另一種選擇是從空中變出的神奇小馬。
這是一個典型的「隱藏在對父母的引用背後的真實類型」的東西。基類'copy ctor簽名base(const base&)
。它不關心你是否傳遞了派生類型,派生類型或基類型。它只能看到它關心的部分,即base
,沒有別的,所以它可以正常工作。
當然,這隻適用於使用公共繼承派生的類型,其形式是兩者之間的關係。
如果你沒有,基類將從哪裏複製?
甲DerivedClass
爲BaseClass
,因此它可以被隱式地澆鑄到一個參照本發明的BaseClass
並在BaseClass
拷貝構造以從複製使用。
所以BaseClass(const BaseClass&)
需要複製的BaseClass
和DerivedClass(const DerivedClass&)
成員的護理需要複製的DerivedClass
成員的照顧。
這樣做可以避免複製每個從其派生的類中的複製構造函數中的複製代碼,並避免在修改基類時發生破壞。
它看起來像是對派生類對象的引用正在傳遞,但實際上它將是隱式地上傳並且將產生對基類子對象的引用。
有效你引用的代碼是完全等效於以下代碼:
DerivedClass (const DerivedClass& obj) :
BaseClass (static_cast<const BaseClass&>(obj))
{
// ...
而後者代碼被完全合理的 - 它通過將其一個參考的已經是基子對象調用的基類的子對象的構造構建其他對象。派生類的
對象有
+「基類的屬性」「派生類的屬性」。當我們要創建派生類的副本,我們稱之爲派生類的拷貝構造函數。實質上,我們希望將「派生類的屬性」+「基類屬性」複製到新對象中。
派生類屬性的副本由派生類複製構造函數處理。要複製基類的屬性,我們需要顯式調用基類複製構造函數。
+1神奇小馬。 –