【问题标题】:Multiple inheritance conflict多重继承冲突
【发布时间】:2012-11-14 01:32:00
【问题描述】:

我有以下代码:

class Interface
{
  virtual void method()=0;
};

class Base : public Interface
{
  virtual void method()
  {
    //implementation here
  }
};

class Parent: public Interface
{

};

class Child : public Base, public Parent
{

};

int main()
{
  Child c;//ERROR: cannot instantiate abstract class
}

现在我知道为什么会这样了,因为我继承了 Parent ,所以我必须再次实现方法。但它已经在基类中定义了,我不想为每个子类覆盖该定义。我认为在 c++ 中有一些标准的方法可以摆脱这个问题(告诉编译器应该使用哪个接口副本)我只是不记得它是什么。

【问题讨论】:

  • 是不是没有虚拟继承,你的Child类中会有两个不同的虚拟method()函数?
  • 我相信,现在就尝试。
  • 为什么要同时继承BaseParent
  • 我想我的部分问题是:您是否有意不在这个菱形层次结构中使用虚拟继承?
  • @0A0D 公平的问题,但这会让我们偏离主题,假设我需要这样做。

标签: c++ polymorphism virtual multiple-inheritance abstract


【解决方案1】:

您有一个菱形的层次结构,但没有使用虚拟继承。

因此,您最终会在 Child 类中得到两个不同的虚拟 method() 函数。

解决此问题的一种方法是转而使用虚拟继承。这样您就只有一个 Child::method() 并且不需要两个实现。

【讨论】:

  • "您有一个菱形的层次结构,但没有使用虚拟继承。"也就是说,代码确实具有菱形层次结构。对于接口,正如您所说,解决方案是通过从接口类虚拟派生来将层次结构变成菱形。
  • @PeteBecker to turn the hierarchy into a diamond by deriving virtually from the interface class. 说得好,我没想到是这样的:P
【解决方案2】:

你说的是dominance

来自链接的文章:

class Parent
{
public:
    virtual void function();
};

class Child1 : public virtual Parent
{
public:
    void function();
};

class Child2 : public virtual Parent
{
};

class Grandchild : public Child1, public Child2
{
public:
    Grandchild()
    {
        function();
    }
};

【讨论】:

    猜你喜欢
    • 2015-04-27
    • 2011-07-29
    • 2011-11-20
    • 2021-10-30
    • 1970-01-01
    • 2012-06-30
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多