2011-09-30 40 views
1

我一直在閱讀有關繼承,但我仍然沒有它100%的清楚,在這裏不用我的問題: 我有例如一類充滿東西:繼承行爲問題

class Something 
{ 
    public: 
    Something(); 
    Something(int A); 
    Something(Something S); 
    ~Something(); 

    Something& operator=(const Something & s); 
    Something operator+(const Something & s) const; 
    // more methods ... 
    protected: 
    int A,B,C; 
} 

實現的所有方法某處,現在我只想要一個新類添加一個屬性,也許一個方法,但我仍然需要與SuperClass(構造函數,析構函數,方法,運算符)相同的行爲,所以我做這樣的事情:

class SomethingMore : public Something 
{ 
    public: 
    void OnlyMethodHere(); 
    private: 
    int D; 
} 

但我得到的是這樣的:

undefined reference to SomethingMore::SomethingMore(int) 

是否有AY告訴編譯器使用的一切就像是在超類或做我不得不在每一個孩子的方法的超類::()的方法?

+0

對代碼的另一種觀察:使用上面的虛擬析構函數,因爲類有虛擬方法。 –

+0

@ vine'th:我在這裏看不到任何虛擬功能。 –

+0

btw,'Something(Something S);'是錯的。我不知道它是否編譯。即使編譯,程序也會因StackOverflow而崩潰! :) – balki

回答

4

您不必爲方法重複。但對於構造函數,您必須在子類中正確定義它們。無論如何,代碼是鍋爐板,除非你有什麼額外的。

SomethingMore::SomethingMore(int i_):Something(i_) 
{ 
} 
+0

每個構造函數? – juliomalegria

+2

編譯器將爲您生成默認構造函數和複製構造函數。但是你有一個不知道如何生成的'int'。因此未定義的參考。所以我相信你只需要定義那個特定的構造函數。 – Robb

+0

我得到了'未定義的引用... ...',在這個例子中沒有提到SuperClass中的每個方法,在這種情況下:構造函數,析構函數,運算符=,運算符+。 我不認爲只是構造函數的問題。 – juliomalegria

0

C++ 0x中可以通過做:

class BaseClass 
{ 
public: 
    BaseClass(int iValue); 
}; 

class DerivedClass : public BaseClass 
{ 
public: 
    using default BaseClass; 
}; 

,但我不知道,現在支持它的任何編譯器。如果你想保持與舊的編譯器兼容,你必須重複所有構造函數在派生類中像

class BaseClass 
{ 
public: 
    BaseClass(int iValue); 
}; 

class : public BaseClass 
{ 
public: 
    DerivedClass(int iValue):BaseClass(iValue){} 
}; 
+0

好的,現在我們對構造函數很熟悉,但是對於其他所有東西(析構函數和所有其他方法),我仍然得到了「未定義的引用......」。 – juliomalegria

+0

什麼是錯誤信息?如果它是Something :: operator =,那麼它意味着鏈接器dosn沒有看到你已經實現了這些方法的位置 - 你確定它們是相互關聯的並且被添加到構建樹中嗎? –

0

您可以獲得與一種包羅萬象的構造在this answer同樣的效果,在C++ 0x中:

class SomethingMore 
{ 
public: 
    ....... 
    template<class... Args> 
    SomethingMore(Args&&... args) : Something(std::forward<Args>(args...)) {} 
}