2010-07-09 65 views
1

這些是我有的函數和Struct聲明,我不允許更改它們。如何向Struct添加新成員

DerivedA giveDerivedA(); 
DerivedB giveDerivedB(); 

struct Base{ 
    QString elementId; 
    QString elementType; 
}; 

struct DerivedA : Base { 
    int a; 
    int b; 
}; 

struct DerivedB : Base { 
    int c; 
    int d; 
}; 

但我需要的是這樣的:

struct DerivedA : Base { 
    int a; 
    int b; 
    void create(); 
    QString doc; 
}; 

我如何添加這些方法和成員結構我?

我的第一個想法是:

struct myA: DerivedA { 
    void create(); 
    QString doc; 
}; 

你有什麼建議嗎?

編輯:第二個替代(選用)

struct myA{ 
    void create(); 
    QString doc; 
    private: 
     DerivedA derivedA; 
}; 
+0

他們爲什麼需要保密?這意味着沒有別的東西可以訪問它們。 – 2010-07-09 06:35:11

+0

爲什麼你不能改變它們? – GManNickG 2010-07-09 06:36:15

+0

@Marcelo坎託斯,對不起沒有私人,我的壞,我編輯。 – metdos 2010-07-09 06:42:46

回答

2

這與人們擴展標準庫類的問題類似。如果您的基類沒有虛擬析構函數,那麼您無法安全地繼承它。在這種情況下,你必須使用自由函數(首選)或者合成。

否則,你有什麼好。

+0

基類沒有虛擬構造函數,在這種情況下繼承的問題是什麼? – metdos 2010-07-09 07:11:42

+2

@metdos:如果你有:'struct base {}; struct derived:base {};'然後:'base * x = new derived;'變成未定義行爲,使用'delete x;'。如果通過基指針刪除派生類型,則基類型必須具有虛擬析構函數。這就是爲什麼你不能從(大多數)標準庫類繼承的原因。 – GManNickG 2010-07-09 07:16:46

+0

謝謝,我現在看到。 – metdos 2010-07-09 07:24:57

0

即不幹活,這是你做的方式。

1

使用組合或繼承,具體取決於類的類型關係(請參閱例如Effective C++中的項32和38)。

+0

謝謝,我喜歡「被實施的條款」。 – metdos 2010-07-09 08:12:08