現在のプロジェクトの異なるクラスの実装間の依存関係を減らすために、私はしばしば純粋な仮想クラス (インターフェイス) を使用します。他の純粋仮想クラスを拡張する純粋仮想クラスと非純粋仮想クラスを持つ階層を持つことさえ珍しくありません。このような状況の例を次に示します。
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
。
ダイヤモンドの問題が発生したときに対処するのではなく、ダイヤモンドの問題に対して予防的なスタンスを取りたいと考えています。クラスを変更して、特定のクラス階層を作成できるようにします。たとえば、ボブがこれを行いたい場合:
class BobsRenderingEngine : public virtual RenderingEngine
{ /* Declares additional pure virtual methods only */ }
class BobsOpenGLRenderingEngine : public SimpleOpenGLRenderingEngine,
public BobsRenderingEngine
{ /* Defines the methods declared in BobsRenderingEngine */ }
これは、仮想的にSimpleOpenGLRenderingEngine
拡張しなければ不可能でした。ボブがこれをやりたがる可能性は非常に低いかもしれないことは承知しています。RenderingEngine
そこで、純粋仮想クラスを常に仮想的に拡張するという慣習を使い始めたので、それらからの多重継承によってダイヤモンドの問題が発生することはありません。おそらくこれは、私が Java 出身で、非純粋仮想クラスで単一継承のみを使用する傾向があるためです。状況によってはおそらくやり過ぎだと思いますが、この規則を使用することの欠点はありますか? これにより、パフォーマンス/機能などに問題が発生する可能性はありますか? そうでない場合、最終的に必要とされないことが多い場合でも、規則を使用しない理由がわかりません。