0

考慮下面這個簡單的例子:如何在C++多繼承中選擇繼承哪些基類方法?

#include <iostream> 
using namespace std; 

class A { 
public: 
    virtual void foo() { 
     cout<<"A"<<endl; 
    } 
}; 

class B: public virtual A { 
public: 
    virtual void foo(){ 
     cout<<"B"<<endl; 
    } 
}; 

class C : public virtual A { 
public: 
    virtual void foo(){ 
     cout<<"C"<<endl; 
    } 
}; 

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

int main() { 
    D d; 
    d.print(); 
    return 0; 
} 

此代碼將無法正常工作,因爲調用foo是ambigous。但問題是:

如何定義哪些類應該繼承的方法?如果我有這樣的機會?

+4

基本上有一個問題,一個建議: 問:您發生多重遺傳歧義的具體用例是什麼? 答:不要使用多重繼承,因爲幾乎總是有解決方法,導致更明確的設計。 – MABVT

+0

@MABVT多重繼承非常有用,替代方法通常會增加複雜性。 – curiousguy

+0

@curiousguy嗯。如果你不必處理那些含糊不清的問題,多重繼承本身可能是有用的!其實我很少有Mult.Inh的用例。有意識的含糊之前涉及... Oo 只是好奇:你有任何具體的例子,在哪裏OPs的情況發生,實際上在一個有用的背景下? 似乎我可以在這一點上學到新東西。 ;) – MABVT

回答

1

消除對函數的調用。看看下面的例子:

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

要調用無論是從A,B,甚至從孩子Foo類:C做

C *obj = new C; 
obj->foo(); 
obj->A::foo(); 
obj->B::foo(); 

來源/靈感:http://www.cprogramming.com/tutorial/multiple_inheritance.html

+0

所以,你建議我經常在C級編寫函數foo,在那裏調用foo的那個變體,我需要哪些變體? –

+0

是的,你需要重寫類C中的foo(),但它不一定需要做任何事情。其用途是作出明確的資格。 Tldr,C :: foo()可以是空的。 – Propolys

+0

如果它可以爲空,爲什麼要調用這個函數? – curiousguy