【问题标题】:Complex multiple inheritance situation复杂的多重继承情况
【发布时间】:2018-05-30 02:07:47
【问题描述】:

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() 时)

【问题讨论】:

  • 您使用的是哪个编译器?你能发布一些真实的代码吗?
  • D::func 在这种情况下会被调用
  • 请阅读您现在应该在此页面顶部看到的 MCVE 链接
  • @DuyMạnhLê “真实代码”仅表示我们可以编译以重现您的问题的代码。不一定是您正在处理的任何代码最初导致了问题。

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


【解决方案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;
}

【讨论】:

    【解决方案2】:

    当我测试你的例子时,我得到的是“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();
    }
    

    您遇到了“钻石”问题。

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

    Diamond 的尖端是 A 类,它有两个派生自它的类,“B”和“D”,位于钻石的每一侧。只有属于菱形侧面的派生类之一可以覆盖菱形尖端的虚函数,而不是两者都可以覆盖(请注意,菱形的底部可以覆盖,在本例中为 E)。在这种情况下是覆盖func 的D 类。如果 B 类将覆盖 func 它不会编译。此外,如果“B”类和“D”类不覆盖任何内容,在您的示例中,将调用 A::func()。

    【讨论】:

    • D 会覆盖 func
    • 为什么是-1?我说“D”覆盖了 func。
    • 给减号的请说明原因。
    • “只有一个派生类可以覆盖...”是不正确的,而且假设与问题无关,因为问题实际上只有一个类覆盖(D )。问题涉及为什么代码调用A::func,您的答案没有解决这个问题。
    • @M.M 当你说“派生类之一可以覆盖不是真的”时,当我用 B 覆盖(也有 D 覆盖)时,我得到一个编译错误“没有唯一的最终覆盖” .即使我测试一个更简单的钻石问题,我也会得到同样的错误。你能解释一下为什么你说那不是真的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 2017-12-12
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 2012-06-02
    相关资源
    最近更新 更多