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

Multiple Inheritance from interfaces (abstract classes)

本文关键字:多重继承 抽象类 接口      更新时间:2023-10-16

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

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();
}

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

这里不需要进行virtual继承。只有当存在菱形继承时才需要虚拟继承(请参阅此处的c++ FAQ)。在这种情况下,您可以简单地正常继承,而不必担心在继承层次结构中有多个BindableDisposable的实例。

另一件事,BindableDisposable可能应该有虚析构函数,这样如果通过任何一个接口销毁类,它们都可以被正确地销毁。所以你应该把它添加到Disposable

virtual ~Disposable() { }

Bindable

virtual ~Bindable() { }

如上所述,您的示例不需要虚拟继承。但是在需要的情况下,无论如何都不应该在从两个类继承的类乘法中使用虚拟继承。

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

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

class Parent
{
  private:
      int someData=0;
  public:
      virtual int someMethod() const = 0;
}
如果没有虚拟继承,你的Component类就会有歧义。它将继承两个现在具体的类,而这两个类又继承一个抽象基类。组件会得到哪个版本的someData和someemethod ?由于非虚拟继承,它将同时得到这两个属性。

在这种情况下,你会希望Bindable和Disposable都从Parent虚拟继承。

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

那么你在Component中就只有一个Parent的副本,解决了歧义。

我也同意@Phantom关于虚析构函数的看法。