だから私はこの考えを持っています.C ++で実装することは基本的に不可能だと思います...しかし、私は尋ねたい. Stroustrup の第 15 章を読みましたが、答えが得られませんでした。継承ダイヤモンドに関する他の 10 億の質問がこの質問に答えているとは思わないので、ここで質問します。
問題は、共通の基本クラス自体を共有する 2 つの基本クラスから継承するとどうなるかということですが、実質的には 2 つのうちの 1 つだけが継承されます。例えば:
class CommonBase { ... };
class BaseA : CommonBase { ... };
class BaseB : virtual CommonBase { ... };
class Derived : BaseA, BaseB { ... };
私がこれをやりたいと思う理由は、ライブラリ全体を再コンパイルせずに既存のライブラリを拡張しようとしているからです (ワームの缶を開きたくない)。変更したい継承のチェーンが既に存在します。基本的にはこのようなものです(アスキーアートを許してください)
LibBase
| \
| \
| MyBase
| |
| |
LibDerived |
| \ |
| \ |
| MyDerived
| |
LibDerived2 |
| \ |
| \ |
| MyDerived2
| |
LibDerived3 |
| \ |
| \ |
| MyDerived3
| |
LibConcrete |
\ |
MyConcrete
写真をゲット?各My
クラスのオブジェクトを、それらが本質的に置き換えるクラスのオブジェクトにしたいのですが、継承図の次のクラスでは、My
基本クラスからオーバーライドされたメソッド実装を使用する必要がありますが、他のすべてのメソッドはライブラリのクラス。ライブラリのクラスは事実上継承しないのでこんな感じ
class LibDerived : LibBase
しかし、クラスを事実上継承させると
class MyBase : virtual LibBase {};
class MyDerived: virtual MyBase, virtual LibDerived {};
MyDerived
vtableがあり、vtableがあるため、オブジェクトMyBase
は1つだけですか?LibBase
この質問が十分に明確であることを願っています。