接口的多重继承(抽象类)

时间:2015-06-06 19:50:09

标签: c++

所以我有两个抽象类;一个定义如下:

class Bindable
{
    virtual void Bind() const = 0;
    virtual void UnBind() const = 0;
};

和另一个定义如下:

class Disposable
{
    virtual void Dispose() = 0;
}

我将Component类继承自其虚拟方法,如下所示:

class Component : public virtual Bindable, public virtual Disposable
{
    //method implementations...
    void Bind() const;
    void UnBind() const;
    void Dispose();
}

所以:我做得对吗?我是否需要虚拟地继承这两个抽象类?还是我错过了什么? (我还没有遇到多重继承的情况,所以我还没有真正习惯......)

2 个答案:

答案 0 :(得分:6)

您无需在此处进行虚拟继承。只有钻石继承才需要虚拟继承(参见C ++ FAQ here)。在这种情况下,您可以简单地继承,而不必担心在继承层次结构中有多个BindableDisposable的实例。

另一件事,BindableDisposable应该有虚拟析构函数,以便在通过任一接口销毁类时它们被正确销毁。所以你应该把它添加到Disposable

virtual ~Disposable() { }

这是Bindable

virtual ~Bindable() { }

答案 1 :(得分:4)

如上所述,您的示例不需要虚拟继承。但是在需要它的情况下,虚拟继承不应该在类中继承多个继承自两个类。

可能需要使用虚拟继承的地方不在您的网站中 组件类,但在您的Bindable和Disposable类中,如果它们之间可能存在歧义。

一个例子是,如果Bindable和Disposable都继承自同一个纯虚基类:

class Parent
{
  private:
      int someData=0;
  public:
      virtual int someMethod() const = 0;

}

如果没有虚拟继承,您的Component类会有歧义。它将继承自两个现在具体的类,这两个类又继承自抽象基类。 Component会获得someData和someMethod的哪个版本?由于非虚拟继承,它将获得两者。

在这种情况下,您希望Bindable和Disposable都可以从Parent继承。

class Bindable: public virtual Parent
{
    virtual void Bind() ;
    virtual void UnBind();
};

class Disposable public virtual Parent
{
    virtual void Dispose();
};

然后,您将在组件中只有一个Parent副本,解决了歧义。

我同意@Phantom关于虚拟析构函数的信息。