次のクラス構造があるとします。
class Car;
class FooCar : public Car;
class BarCar : public Car;
class Engine;
class FooEngine : public Engine;
class BarEngine : public Engine;
Carその へのハンドルも与えましょうEngine。はFooCarで作成されFooEngine*、BarCarは で作成されBarEngine*ます。オブジェクトがダウンキャストせずにFooCarメンバー関数を呼び出せるように配置する方法はありますか?FooEngine
クラス構造が現在のようにレイアウトされている理由は次のとおりです。
- すべて
Carの にはEngine. さらに、 aFooCarは a のみを使用しFooEngineます。 Engineコピーして貼り付けたくない、すべてのユーザーが共有するデータとアルゴリズムがあります。Engineがその について知る必要がある関数を書きたいと思うかもしれませんCar。
dynamic_castこのコードを書いているときに入力するとすぐに、何か間違ったことをしている可能性があることがわかりました。これを行うより良い方法はありますか?
アップデート:
これまでの回答に基づいて、私は次の 2 つの可能性に傾いています。
- 純粋
Carな仮想getEngine()関数を提供する必要があります。これにより、正しい種類の を返す実装が可能FooCarになります。BarCarEngine Engineすべての機能をCar継承ツリー に吸収します。Engineメンテナンス上の理由で(Engine別の場所に保管するため)壊れていました。これは、小さなクラス (コード行が小さい) を増やすか、大きなクラスを減らすかのトレードオフです。
これらのソリューションのいずれかに対するコミュニティの強い好みはありますか? 私が考慮していない 3 番目のオプションはありますか?