【问题标题】:How in C++ multiple inheritance choose of which base class method will be inherited? [duplicate]在 C++ 多重继承中如何选择继承哪个基类方法? [复制]
【发布时间】:2015-11-16 20:36:49
【问题描述】:

考虑以下简单示例:

#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 的调用不明确。但问题是:

如何定义应该从哪些类继承哪些方法?如果我有这样的机会呢?

【问题讨论】:

  • 基本上有一个问题和一个建议: 问:发生多重继承歧义的具体用例是什么?答:不要使用多重继承,因为几乎总有办法让设计更加明确。
  • @MABVT 多重继承非常有用,替代方案通常会增加复杂性。
  • @curiousguy 嗯。如果您不必处理这些歧义问题,多重继承本身可能很有用!事实上,我很少有 Mult.Inh 的用例。之前涉及有意识的模棱两可... Oo 只是好奇:您是否有任何具体的例子,OPs 情况发生的地方并且实际上是在一个有用的上下文中?似乎我可以在这一点上学到新的东西。 ;)
  • @MABVT 您是否经常对 MI 产生歧义?当你这样做时,它是一个难题?
  • @MABVT 没有人说 MI 是灵丹妙药,或者它比其他一些解决方案更好。我喜欢回答“MI 需要吗?”这个问题。从这个常见问题解答。我建议您阅读此部分的常见问题解答isocpp.org/wiki/faq/multiple-inheritance

标签: c++ inheritance multiple-inheritance ambiguity virtual-inheritance


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

【讨论】:

  • 那么,你建议我经常在 C 类中编写函数 foo,在哪里调用我需要的 foo 的变体?
  • 是的,你需要重写 C 类中的 foo(),但它不一定需要做任何事情。它的用途是做出明确的限定。 Tldr, C::foo() 可以为空。
  • 如果可以为空,为什么还要调用这个函数?
  • 你不需要调用它。它只是为了消除歧义。它也可以调用函数,但不是必需的。
  • foo()的规格是什么?如果规范允许空主体,为什么还需要这个函数?
猜你喜欢
  • 1970-01-01
  • 2017-11-25
  • 2021-07-08
  • 1970-01-01
  • 2021-11-08
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
相关资源
最近更新 更多