来自接口(抽象类)的多重继承
Multiple Inheritance from interfaces (abstract classes)
我有两个抽象类;一个定义如下:
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)。在这种情况下,您可以简单地正常继承,而不必担心在继承层次结构中有多个Bindable
或Disposable
的实例。
另一件事,Bindable
和Disposable
可能应该有虚析构函数,这样如果通过任何一个接口销毁类,它们都可以被正确地销毁。所以你应该把它添加到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关于虚析构函数的看法。
相关文章:
- C++中模板化异常类的多重继承
- 从抽象类继承以创建另一个抽象类时,我应该重新声明所有虚函数吗?
- 抽象类析构函数与继承"Shutdown"函数
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 多重继承中的派生类的行为类似于聚合
- C++的抽象类继承和构造函数的问题
- 无法使用多重继承 c++ 实例化抽象类
- 有没有办法实现从 c++ 中其他抽象类多重继承的抽象类?
- 将void*强制转换为具有多重继承的类
- 消除多重继承中类成员的歧义
- 多重继承求解抽象类
- 多重继承抽象类
- 多重继承:2类1方法
- c++元编程:必须继承抽象类的模板参数
- 构造具有多重继承的类
- 使用多重继承来满足抽象基类
- 如何在c++中对抽象类的多重继承使用clone()
- 在c++中获取一个类的指针,该类是另一个具有多重继承的类的一部分
- 多重继承派生类:如何在不重复调用 base 的情况下重用派生函数
- 来自接口(抽象类)的多重继承