Я часто использую чистые виртуальные классы (интерфейсы), чтобы уменьшить зависимости между реализациями разных классов в моем текущем проекте.Для меня нередко даже иметь иерархии, в которых у меня есть чисто виртуальные и не чистые виртуальные классы, которые расширяют другие чисто виртуальные классы.Вот пример такой ситуации:
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
.
IЯ хочу занять превентивную позицию в отношении проблемы с алмазом вместо того, чтобы заниматься ею, когда она становится проблемой, особенно потому, что мне нравится писать код, который как можно проще использовать кому-то другому, и я не хочу, чтобы ему приходилось изменятьмои классы, чтобы они могли создавать определенные иерархии классов, например, если бы Боб хотел сделать это:
class BobsRenderingEngine : public virtual RenderingEngine
{ /* Declares additional pure virtual methods only */ }
class BobsOpenGLRenderingEngine : public SimpleOpenGLRenderingEngine,
public BobsRenderingEngine
{ /* Defines the methods declared in BobsRenderingEngine */ }
Это было бы невозможно, если бы я не сделал SimpleOpenGLRenderingEngine
extension RenderingEngine
виртуально. Мне известно, что вероятность того, что Боб захочет это сделать, может быть очень низкой.
Итак, я начал использовать соглашение о виртуальном всегда расширении чисто виртуальных классов, чтобы их можно было многократно наследовать.не вызывает проблемы с алмазами.Может быть, это из-за того, что я пришел из Java и склонен использовать только одиночное наследование с не чистыми виртуальными классами.Я уверен, что в некоторых ситуациях это, вероятно, излишне, но есть ли недостатки в использовании этого соглашения?Может ли это вызвать проблемы с производительностью / функциональностью и т. Д.?Если нет, то я не вижу причины не использовать соглашение, даже если в конце концов оно может и не понадобиться.