c++ - 抽象类可以继承自 "normal"类吗?

标签 c++ class abstract-class multiple-inheritance

我正在寻找 C++ 中多重继承的有用示例,并在此处找到了创建窗口的示例:A use for multiple inheritance?并对其进行了一些修改。它在概念上看起来像这样:

class Window
class Skinable  // abstract
class Draggable // abstract
class DraggableSkinnableWindow : Window, Draggable, Skinnable

我认为这应该是 MI 有意义的一个很好的例子。由于实现 Skinable 的类没有意义,因此应该将其定义为抽象的。

现在:如果我不使用 MI 的概念,这会是什么样子。 我会使用像这样的简单层次结构:

class  Window
class Dragable : public Window
class Skinable : public Dragable
class DraggableSkinnableWindow : Skinnable

我仍然希望 Dragable 和 Skinable 也是抽象的,但这可能吗?对于相同的上下文但不使用 MI,第二个示例是否是一个很好的解决方案?

提前致谢!

最佳答案

虽然您的示例是多重继承的可靠用例,但我不同意 Skinnable 没有实现的说法。相反,正如 @devianfan 在他的评论中提到的那样,您的单一继承替代方案无法为概念分类法建模。

它是关于交叉轴分类的。窗口既可换肤又可拖动,但这些品质都不是相互依赖的。

请考虑一下,正如您的示例域所建议的那样,您的应用程序代码由一组图形用户界面元素组成。您可能希望根据它们的功能对它们的子组执行操作。例如,您可能会根据某些自定义操作所有可换肤元素的外观。另一方面,您的 GUI 中可能有一些元素是可拖动的,并且应该在某些用户输入事件上得到通知。窗口是属于这两个类别的事物的一个很好的例子。

关于c++ - 抽象类可以继承自 "normal"类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30593428/

相关文章:

c++ - [c++]为什么我的类析构函数被调用了两次?

c# - 在通用 C# 类中链接隐式运算符

python - 一般如何创建仅测试 Django 模型(特别是使用 pytest-django)

c++ - 编译器如何在下面的代码中通过ADL找到模板函数X::max(T const&, T const&)?

java - 行为类似于类字段的方法

c++ - 我怎么知道指向基类对象的指针数组中元素的类型是什么,它将为派生类分配内存

c# - 抽象类设计

c++ - 从 boost ptime 获取年份

c++ - dllexport/dllimport 是否忽略成员模板函数?

c++ - MSVC9 : How do I view a location in memory?