2014-06-06 88 views
0

首先,如果這是一個新手問題,但我是初學者。 我的問題是我相信鑽石問題的一個變種。多繼承類中的虛函數

想象我有以下類別:

class A{ public: virtual foo();}; 

class B{ public: foo();}; 

class C{ public: foo();}; 

class D: public A, public B, public C{ 
    public: foo(); 
}; 

我的問題是是否有可能調用從Dfoo()和具有跨越ABCD運行虛擬功能。我試過這個,但d::foo()函數覆蓋了所有其他foo()函數。

或者它是唯一可能的,如果你做一個1:2的繼承計劃?

class A{ public: virtual foo();}; 

class B: public A { public: foo();}; 

class C: public B { public: foo();}; 

class D: public C { public: foo();}; 

我之所以這樣問是因爲我希望能夠構建ABC在不同的班級,而不必每次也ABC構建但保留運行的虛擬功能的可能性而無需針對每種情況請求A::foo(),B::foo(),C::foo()

+0

「我的問題是可以從D類調用foo()並讓虛擬函數在A,B,C和D上運行」你是什麼意思? – Brian

+0

你問你是否可以調用D.foo()並讓它一次調用A.foo(),B.foo()和C.foo()? – bstar55

+0

是bstar55。我想同時打電話給他們所有人。所以調用D.foo()會調用A.foo(),B.foo(),C.foo()和D.foo()。改變了這個問題,儘量減少混淆。 – hadroque

回答

0

這叫做函數重載,所以你不能自己做你想做的。

你要做這樣的:

#include <iostream> 

class A { 
public: 
    virtual void foo() { 
    std::cout << "foo of A\n"; 
    } 
}; 

class B { 
public: 
    // virtual keyword is not needed, 
    // but it's to write it so that you 
    // remind the reader that foo is virtual 
    virtual void foo() { 
    std::cout << "foo of B\n"; 
    } 
}; 

class C { 
public: 
    virtual void foo() { 
    std::cout << "foo of C\n"; 
    } 
}; 

class D : public A, public B, public C { 
public: 
    virtual void foo() { 
    A::foo(); 
    B::foo(); 
    C::foo(); 
    std::cout << "foo of D\n"; 
    } 
}; 

int main() 
{ 
    D d_object; 
    d_object.foo(); 
    return 0; 
} 

不過,我強烈建議您閱讀本answer,因爲你很可能得到:

has virtual method..but not virtual constructor

通常警告是明智的視爲真正的錯誤,因爲它們通常會暴露邏輯錯誤。

+0

感謝您的指點。如果我正確理解這個,這個例子也可以在沒有聲明虛函數的情況下構造?只需重載函數foo()即可。 – hadroque

+0

@hadroque true。但你可以刪除'virtual'關鍵字並找出答案。我希望你現在明白爲什麼會這樣。不用謝。 – gsamaras

+0

順便說一下,我認爲你的問題-1對於初學者來說太多了,所以我正在投票平衡@hadroque。 :) – gsamaras

0

您將不得不實施D::foo類明確呼叫A::foo(),B::foo()C::foo()。沒有辦法讓它自動在每個父類上調用foo()