2012-12-10 81 views
2

我知道子類可以繼承超類的方法,但是超類可以爲子類做同樣的事情嗎?例如:超類可以從其子類繼承方法嗎?

Alpha *a = new Alpha(); 
Beta *b = new Beta(); 
Gamma *g = new Gamma(); 
g = b; 

在第四條語句,我創建一個伽瑪對象是一個測試對象,但伽瑪是超類和β是子類。所以要麼g得到一個指向b的指針,否則這個代碼將無法編譯,我不太明白哪個答案是正確的。如果有人可以請澄清,那會很好。

+1

代碼不應該編譯。 –

+3

*「在第四個聲明中,我創建了一個Gamma對象」*。第四條語句創建的唯一內容是內存泄漏。 – Joe

+0

您能否更清楚地解釋「Alpha」,「Beta」和「Gamma」的繼承結構是什麼? (只要每個人的'class'行就足夠了。) – duskwuff

回答

1

不,超類無法從其子類繼承方法,因爲通常超類不應該有知道從它派生的東西。

+1

如果你有兩個繼承對方的類,該怎麼辦?無限多態! –

+2

@SamIam(題外話),讓我想起魔獸世界中魔法羊同時對戰的時代; * baaaah〜*;) –

2

它不能繼承他們在技術上,但它可以使用他們,如果你使用Curiously Recurring Template Pattern (CRTP)

template<class SubClass> 
class SuperClass 
{ 
    void DoSomething() 
    { 
     static_cast<SubClass *>(this)->Foo(); 
    } 
}; 

class SubClass: public SuperClass<SubClass> 
{ 
    void Foo(); 
}; 
+0

確實,這是一種訪問你的函數的方法,但是如果你明確地從你的模板子類中調用一個函數,你肯定應該檢查你的設計.... –

相關問題