次のクラス構造があるとします。
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
になります。BarCar
Engine
Engine
すべての機能をCar
継承ツリー に吸収します。Engine
メンテナンス上の理由で(Engine
別の場所に保管するため)壊れていました。これは、小さなクラス (コード行が小さい) を増やすか、大きなクラスを減らすかのトレードオフです。
これらのソリューションのいずれかに対するコミュニティの強い好みはありますか? 私が考慮していない 3 番目のオプションはありますか?