2012-01-09 134 views
3

我是C++新手,剛開始學習多態。我知道如果我爲派生類創建一個對象,那麼派生類和基類的構造函數都會被調用。這是否意味着,當我爲派生類創建一個對象時,最終我會得到兩個對象 - 一個是由基類的構造函數創建的,另一個是由派生類的構造函數創建的?關於基類和派生類的構造函數調用

任何人都可以解釋一下,當我想爲派生類創建一個對象時,什麼是基類構造函數的工作。

回答

10

基類構造函數的工作是初始化基類成員變量(考慮基類中private成員變量的情況)。

當您爲派生對象調用構造函數時,最終只能得到一個對象。基類構造函數初始化新對象的基類部分,派生構造函數初始化相同新對象的派生類部分。

2

構造函數不分配空間並啓動對象的實例;他們在分配空間後立即初始化對象。

當您在堆棧上聲明對象或使用新的首先保留內存並創建對象,然後執行構造函數,從基礎構造函數開始,向上朝向最派生類。

+0

作爲一個對象的生命週期,直到它的構造函數完成,我會說構造函數_do_創建對象(在它們被調用的分配內存區域)。C++不像Java那樣,構造函數更像後創建初始化函數(例如,您可以從Java中的構造函數體調用'super')。 – 2012-01-09 21:39:34

+0

@Charles編輯了我的答案,以略微改變詞彙量,以免暗示它們類似於java。 – Elemental 2012-01-09 22:10:40

1

您將最終得到一個包含基類對象的派生類對象。

構造函數不會奇蹟般地創建另一個對象實例。它們初始化某段內存,但調用構造函數和分配內存不是一回事 - 後者要麼在後臺完成(對於具有自動和靜態存儲持續時間的對象),要麼用newmalloc(對於具有動態存儲時間)。

編輯:之前我生氣評論它:「幕後」是一個模糊的方式來說,具有自動或靜態存儲持續時間的對象的定義確保它獲得內存。

1

無論您是在創建base classderived classobject,您最終都會得到一個對象。

僅僅因爲基類的構造函數被調用,並不意味着你爲該調用獲得了一個額外的對象。在這裏,將執行b ase class constructor,它通常會設置基類的屬性。整個對象將由基類屬性和派生類屬性組成。

0

如果你有一個類,那麼你將不得不定義一個構造函數或構造函數(在某些情況下你不需要)。構造函數的目的是初始化類數據成員,您爲其數據成員賦予一個值。除非數據成員是恰好具有默認構造函數的類的實例,否則您沒有給它賦值的任何數據成員將具有未定義的值。

因此,當您創建該類的實例時,編譯器將調用相應的構造函數,並且剛剛創建的實例成員將在構造函數中設置它們時使用值初始化數據。

如果您有派生類,則可以向其添加數據成員,但請記住它也有一個繼承的成員:基類。因此,當您在派生類中定義構造函數時,必須調用基類的構造函數(以便基類的成員完全初始化),併爲派生類自己的數據成員賦值。

因此,您創建派生類的實例,派生類構造函數被invoved。作爲其功能的一部分,它調用其基類的構造函數(所以你可能會說兩個構造函數,但這是查看它的錯誤)。

如果您創建基類的實例,則只調用該構造函數。

+0

感謝您的解釋。總而言之,如果我爲派生類創建一個對象,那麼首先調用基類構造函數來初始化基類成員,然後調用派生類構造函數,並創建新的派生類對象。如果我的理解錯誤,請糾正我。 – newbie 2012-01-09 21:32:02

0

當我們創建一個對象時,構造函數將被調用。它不在構造函數調用object時被創建。

您可以假定創建對象作爲一個函數,而構造函數是另一個函數,它在它內部調用。

假定A是一個基類和B是一個派生類,

類A {

}

類B:公共甲 {

}

我們將以下面的方式爲A類創建對象,

A obja; 

or 

A obja = new A(); 

在這兩種情況下,你可以假設一個函數創建獲取調用,

A::Create() 
{ 
    A(); 
} 

如果要創建派生B類對象,然後創建B的方法將被調用,

所以在內部創建方法的B看起來會像下面那樣,

B::Create() 
{ 
    B(); 
    A(); 
} 

所以當我們創建Derived類的對象時首先進行了派生類的初始化,然後Base cla ss初始化發生。這並不意味着對象被創建兩次。

將在您創建對象使用的對象中創建對象。

B obj;

B obj = new B();

調用構造函數是作爲Create函數中調用的構造函數的內部功能。

注:上述代碼中的功能僅用於說明目的。

+0

-1我相信用構造函數調用代替Create會比這裏解釋的問題困惑得多。尤其是在那個人不得不顯式調用基本重寫函數(細化)而不是構造函數。 – Elemental 2012-01-09 10:57:57

0

當派生類的對象被創建時,那麼該類的構造函數將被首先創建,然後使用基類的構造函數將在調用時被單獨的對象調用它將被調用目的。

相關問題