2010-08-17 82 views
2

說我下面創建一個派生類,當我在C++中派生一個類時,它是否創建一個基類對象並將其作爲我的成員變量存儲在派生類中?

class CHIProjectData : public QObject 
{ 
CHIProjectData(QMap<QString,QString> aProjectData, 
          CHIMetaData* apMetaData = 0, 
          QObject* parent = 0); 
    private: 
      QMap<QString,QString> m_strProjectData; 
      CHIAkmMetaData* m_pMetaData; 
}; 

和我一樣實施,

CHIProjectData::CHIProjectData(QMap<QString,QString> aProjectData, 
           CHIMetaData* apMetaData, 
           QObject* aParent) 
    :m_strProjectData(aProjectData), 
    m_pMetaData(apMetaData), 
    QObject(aParent) 
{ 

} 

我知道我發起成員變量m_strProjectData,m_pMetaData在構造函數中。但最後一部分「QObject(aParent)」做了什麼?它創建一個基類的對象,並認爲這是一個成員變量?

回答

6

QObject(aParent)電話QObject的與aParent參數的構造函數。在這種情況下,QObject不是成員變量。它可能看起來像一個微妙的點,但它很重要,因爲您訪問子對象的屬性和方法的方式需要與成員變量不同的語法。

下面是一個類比,試圖理解子對象和成員變量之間的區別。

在電影「蝙蝠俠:黑夜」中有一個場景,蝙蝠俠正在追逐他的車中的壞人。但是汽車被損壞,無法使用,他必須逃跑。此時蝙蝠俠推動了一個按鈕,其餘的部分汽車將成爲摩托車。這有點像一個子對象。汽車is a摩托車。

現在考慮一輛小型拖車的情況,這種小型車輛在美國的公路上經常出現。在這種情況下,RV has a車輛。該車輛是RV的成員變量。

+2

製作的投票是 - 類似於蝙蝠俠電影。 – MadcapLaugher 2010-08-18 01:16:38

+0

這並不是我所瞭解的 - 雖然。蝙蝠俠的車既是摩托車又是汽車的實例(不是 - 一個,它是一個實例!)。而獅子是一種動物(兩種類型)。 – 2010-08-18 06:24:10

+0

@Frank:無可否認,它不是一個完美的比喻。但我認爲它確實可以實現,這是我能想到的最好的比喻! – 2010-08-18 16:04:49

0

作爲派生類的基礎的類實例有時稱爲「基類子對象」,因此在某種意義上,基類是派生類的不同「部分」。

在您的構造函數的初始化程序列表中,QObject(aParent)正在選擇基類的構造方式。在這種情況下,正在使用單個參數構造函數。如果從派生類的構造函數的初始化程序列表中省略了基類,則將使用其默認構造函數。

它不是一個嚴格的成員變量,儘管它像一個成員變量,它是派生類的組成部分以及任何其他基類子對象和其他成員。

1

本質上,這就是發生了什麼。對象的基類部分(如其數據成員)稱爲子對象

QObject(aParent)中初始化基的概念與初始化成員類似,但鹼始終首先被初始化。因此,在成員之前列出QObject會更清楚,所以初始化符列表按時間順序排列。

無論初始化程序的寫入方式如何,初始化的順序總是遵循基址在class之後的順序以及成員聲明的順序。

0

不完全。它告訴基類的構造函數要做什麼。想象一下這個類:

class A 
{ 
public: 
    A(int val) 
    : value(val) 
    { 
    } 
protected: 
    int value; 
}; 

要構造A,你必須傳遞一個int。即使你從中得出結論,情況總是如此。

假設你是B類,它來自A。你A,但你還是要告訴你的類的A部分如何構建自己:

class B : public A 
{ 
public: 
    B() 
    : A(5) 
    { 
    } 

    int GetValue() 
    { 
    return value; 
    } 
}; 

A成員成爲你的會員,但是,因爲你A

在機器存儲器中,場景與您描述的相似,但僅限於簡單情況。虛擬函數,多重繼承和虛擬繼承會變得更加複雜。如果你堅持is-ahas-a關係,那麼你可能會避免一些麻煩:)

相關問題