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