我知道子類可以繼承超類的方法,但是超類可以爲子類做同樣的事情嗎?例如:超類可以從其子類繼承方法嗎?
Alpha *a = new Alpha();
Beta *b = new Beta();
Gamma *g = new Gamma();
g = b;
在第四條語句,我創建一個伽瑪對象是一個測試對象,但伽瑪是超類和β是子類。所以要麼g得到一個指向b的指針,否則這個代碼將無法編譯,我不太明白哪個答案是正確的。如果有人可以請澄清,那會很好。
我知道子類可以繼承超類的方法,但是超類可以爲子類做同樣的事情嗎?例如:超類可以從其子類繼承方法嗎?
Alpha *a = new Alpha();
Beta *b = new Beta();
Gamma *g = new Gamma();
g = b;
在第四條語句,我創建一個伽瑪對象是一個測試對象,但伽瑪是超類和β是子類。所以要麼g得到一個指向b的指針,否則這個代碼將無法編譯,我不太明白哪個答案是正確的。如果有人可以請澄清,那會很好。
不,超類無法從其子類繼承方法,因爲通常超類不應該有知道從它派生的東西。
如果你有兩個繼承對方的類,該怎麼辦?無限多態! –
@SamIam(題外話),讓我想起魔獸世界中魔法羊同時對戰的時代; * baaaah〜*;) –
它不能繼承他們在技術上,但它可以使用他們,如果你使用Curiously Recurring Template Pattern (CRTP)。
template<class SubClass>
class SuperClass
{
void DoSomething()
{
static_cast<SubClass *>(this)->Foo();
}
};
class SubClass: public SuperClass<SubClass>
{
void Foo();
};
確實,這是一種訪問你的函數的方法,但是如果你明確地從你的模板子類中調用一個函數,你肯定應該檢查你的設計.... –
代碼不應該編譯。 –
*「在第四個聲明中,我創建了一個Gamma對象」*。第四條語句創建的唯一內容是內存泄漏。 – Joe
您能否更清楚地解釋「Alpha」,「Beta」和「Gamma」的繼承結構是什麼? (只要每個人的'class'行就足夠了。) – duskwuff