我不是 C 專家,我主要完成了 Java 和 C#。今天老師說了一句讓我很困惑的話。我試圖通過做一些研究來驗證資訊,但我最終更加困惑。
假設我有 A 類和 B 類。 A 類是基類,B 派生自 A。
現在我已經知道,當創建類 B 的物件時,會呼叫類 A 的建構式,然后呼叫類 B 的建構式。類似地,當 B 類的物件被銷毀時,呼叫 B 類解構式,然后呼叫 A 類的解構式。
到目前為止,我的理解是 B 類包含 A 類的所有內容,除了它的建構式和解構式。我認為當構建來自類 B 的物件時,記憶體中只創建了一個物件(A 和 B 型別)。
現在我的老師說在構建 B 時,會創建 2 個單獨的物件并以某種方式“鏈接”在一起:A 類之一,然后是 B 類。這兩個物件都將存在于記憶體中,直到呼叫 B 類物件的銷毀. 然后 B 類物件將在 A 類物件被銷毀之前被銷毀。
哪一個是正確的?
ps 對不起,如果我的英語馬馬虎虎,那不是我的母語...
編輯:我試著改寫:
我認為:B 類包含 A 類的所有屬性和方法。當我從 B 類創建一個物件時,記憶體中只存在 1 個物件。呼叫 A 類的建構式只是為了初始化最初來自 A 類的物件部分。
老師說:當我從B類創建一個物件時,在記憶體中創建了2個物件。當我命令銷毀我的物件時,首先銷毀記憶體中的 B 類物件,然后銷毀同樣保留在記憶體中的 A 類物件。老師始終無法闡明 B 類物件如何能夠使用 A 類物件的方法和屬性。
對我來說,這似乎也暗示著記憶體中某處有一個我不知道并且我幾乎無法控制的“幽靈物件”。
uj5u.com熱心網友回復:
根據http://www.vishalchovatiya.com/memory-layout-of-cpp-object/#Layout_of_C_Object_With_Inheritance
這兩個類:
class X { int x; string str; public: X() {} virtual ~X() {} virtual void printAll() {} }; class Y : public X { int y; public: Y() {} ~Y() {} void printAll() {} };
將在記憶體中表示,以便 Y 的記憶體布局包含基類的資料成員,然后是派生類的資料成員:
| | |------------------------------| <------ Y class object memory layout | int X::x | stack |------------------------------| | | int string::len | | |string X::str ----------------| | | char* string::str | \|/ |------------------------------| |-------|--------------------------| | X::_vptr |------| | type_info Y | |------------------------------| |--------------------------| | int Y::y | | address of Y::~Y() | |------------------------------| |--------------------------| | o | | address of Y::printAll() | | o | |--------------------------| | o | ------|------------------------------|-------- | X::X() | |------------------------------| | | X::~X() | | |------------------------------| | | X::printAll() | \|/ |------------------------------| text segment | Y::Y() | |------------------------------| | Y::~Y() | |------------------------------| | Y::printAll() | |------------------------------| | string::string() | |------------------------------| | string::~string() | |------------------------------| | string::length() | |------------------------------| | o | | o | | o | | |
同一個頁面也有其他場景的記憶體布局,包括多重繼承和虛擬繼承。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/362176.html
