复杂的多重继承情况

时间:2018-05-30 02:07:48

标签: c++ oop multiple-inheritance virtual-inheritance diamond-problem

class diagram

class A {public: virtual int func();};
class B: virtual public A {};
class C: virtual public A {};
class D: virtual public C {public: virtual int func();};
class E: public B, public D {}; 
// e is an object of E
e->func(); // this will run func defined in A, not in D

我有一个多继承情况,如上例所示。如何实现它来调用派生最多的方法? (当我写func()时,拨打D中实施的A,而不是e->func()

2 个答案:

答案 0 :(得分:1)

当我测试你的例子时,我会得到" D"不是" A"如你所说。

class A {public: virtual void func() {std::cout << "A" << std::endl;} };
class B: virtual public A {};
class C: virtual public A {};
class D: virtual public C {public: virtual void func() {std::cout << "D" << std::endl;} };
class E: public B, public D {};

int main()
{
  E e {};
  e.func();
}

你有&#34; Diamond&#34;问题。

   A  
 B   D  // only B or D can override A::func()  
   E    // can override A::func()

钻石的尖端是A级,它有两个派生自它的类,&#34; B&#34;在钻石的每一边都有&#34; D&#34;只有一个衍生类属于钻石边的一部分可以覆盖钻石尖端的虚拟函数,而不是它们两者(注意钻石的底部可以覆盖,在本例中为E)。在这种情况下,D类覆盖func。如果B类覆盖func,它就不会编译。如果上课&#34; B&#34;和&#34; D&#34;不要覆盖任何东西,在你的例子中,将调用A :: func()。

答案 1 :(得分:1)

如果你在D中实现了func,那么就会被调用。你可以在这里看到正在运行的例子

https://ideone.com/kwJubg

class A {public: virtual int func(){cout<<"In A";};};
class B: virtual public A {};
class C: virtual public A {};
class D: virtual public C {public: virtual int func(){cout<<"In D";};};
class E: public B, public D {}; 


int main()
{
    E *e = new E();
    e->func();    
    return 0;
}