所以我有两个抽象类;一个定义如下:
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();
}
所以:我做得对吗?我是否需要虚拟地继承这两个抽象类?还是我错过了什么? (我还没有遇到多重继承的情况,所以我还没有真正习惯......)
答案 0 :(得分:6)
您无需在此处进行虚拟继承。只有钻石继承才需要虚拟继承(参见C ++ FAQ here)。在这种情况下,您可以简单地继承,而不必担心在继承层次结构中有多个Bindable
或Disposable
的实例。
另一件事,Bindable
和Disposable
应该有虚拟析构函数,以便在通过任一接口销毁类时它们被正确销毁。所以你应该把它添加到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关于虚拟析构函数的信息。