【发布时间】:2014-06-29 05:02:45
【问题描述】:
我有一些非常复杂的虚拟对象层次结构,将 3D 引擎中的所有元素表示为抽象类(接口)。
例如,我有Renderable 哪个父级是Sizeable(使用getSize() 方法)。 Sizeable 继承自 Positionable(与 getPosition())等。
该结构很好且符合逻辑(例如,3D 模型为Renderable,用于蒙皮的骨骼骨骼为Sizeable,而相机仅为Positionable)。
还有一个“超级班”,Engine3D。
我的目标是:
我必须为那个“图形事物”(模块)编写“实现”。这将是 DirectX 的“实现”。 目标:使用我的“实现”的程序员可以快速简单地切换到其他的(他使用的实现对他来说几乎是透明的)。
我想保持这种状态:
//choosing module "implementation" ("implementation" mentioned here only)
Engine3D * engine = new MyEngine3D();
Renderable * model = engine->createModel(...);
//line above will return MyRenderable class in fact,
//but user (programmer) will treat it as Renderable
为什么我要创建“自己的”版本的Renderable 和所有其他版本?因为它们将共享一些“实现”特定的数据(DirectX 结构的指针等)。
我的问题是:
但是那样,我会创建一个“镜像”——原始模块对象层次结构的副本,每个类名前面都有My。此外,MyRenderable 必须同时继承自 Renderable(以覆盖render())和MySizeable(以获取 DirectX 矩阵等)。
这涉及到虚拟继承,确实使结构复杂化。
有没有更简单的方法?
我主要是在谈论避免虚拟多继承(我猜只是多继承就可以了)。
【问题讨论】:
标签: c++ inheritance virtual multiple-inheritance virtual-inheritance