我经常使用纯虚拟类(接口)来减少当前项目中不同类的实现之间的依赖关系。我什至有层次结构,其中我有纯虚拟和非纯虚拟类扩展其他纯虚拟类,这对我来说并不罕见。下面是这种情况的一个例子:
class Engine
{ /* Declares pure virtual methods only */ }
class RunnableEngine : public virtual Engine
{ /* Defines some of the methods declared in Engine */ }
class RenderingEngine : public virtual Engine
{ /* Declares additional pure virtual methods only */ }
class SimpleOpenGLRenderingEngine : public RunnableEngine,
public virtual RenderingEngine
{ /* Defines the methods declared in Engine and RenderingEngine (that are not
already taken care of by RunnableEngine) */ }
两者兼而有之RunnableEngine
,使钻石问题不受影响。RenderingEngine
Engine
SimpleOpenGLRenderingEngine
我想对钻石问题采取预防性立场,而不是在它成为问题时处理它,特别是因为我喜欢编写尽可能容易让其他人使用的代码,我不希望他们不得不修改我的类,以便他们可以创建特定的类层次结构,例如,如果 Bob 想这样做:
class BobsRenderingEngine : public virtual RenderingEngine
{ /* Declares additional pure virtual methods only */ }
class BobsOpenGLRenderingEngine : public SimpleOpenGLRenderingEngine,
public BobsRenderingEngine
{ /* Defines the methods declared in BobsRenderingEngine */ }
如果我没有进行虚拟SimpleOpenGLRenderingEngine
扩展,这是不可能的。我知道 Bob 想要这样做的可能性可能非常低。RenderingEngine
所以,我已经开始使用总是虚拟地扩展纯虚拟类的约定,这样它们的多重继承就不会导致菱形问题。也许这是因为我来自 Java 并且倾向于只对非纯虚拟类使用单继承。我敢肯定在某些情况下这可能是矫枉过正,但使用这种约定有什么缺点吗?这会导致性能/功能等问题吗?如果不是,我看不出有理由不使用该约定,即使最终可能通常不需要它。