親クラス「base」と「base」から継承する別のクラス「派生」があります。
「派生」には1つのメソッドcH1があります。
私がこれを行う場合:
base* b = new derived();
そして、私はこれができるようになりたいです:
b->cH1();
明らかに私はできません、そして2つの解決策があります:
- cH1をベースで純粋な仮想として宣言します。
またはこれを行う:
dynamic_cast<derived*>(b)->cH1();
どちらがより良い習慣ですか?
親クラス「base」と「base」から継承する別のクラス「派生」があります。
「派生」には1つのメソッドcH1があります。
私がこれを行う場合:
base* b = new derived();
そして、私はこれができるようになりたいです:
b->cH1();
明らかに私はできません、そして2つの解決策があります:
またはこれを行う:
dynamic_cast<derived*>(b)->cH1();
どちらがより良い習慣ですか?
If cH1 method semantically applies to base, then make it a base's method.
Else, leave cH1 to derived, and use dynamic_cast.
I think the semantics of your classes should drive your choice.
For example, if you have a base class Vehicle and derived classes Car, Motorbike, and Aircraft, a method like TakeOff() has a semantics compatible with Aircraft but not with Car or Motorbike, so you may want to make TakeOff() an Aircraft method, not a Vehicle method.
まず、を使用するdynamic_castにbaseは、少なくとも1つの仮想関数が必要です。
第二に、の使用dynamic_castは通常、設計ミスの兆候です。derivedが本当にの子である場合base、オブジェクトはオブジェクトが期待されるderived場所に立つことができる必要があります。これは通常、純粋仮想かどうかにかかわらず仮想関数を持ち、それらの一部またはすべてをオーバーライドすることを意味します。basebasederived
しかし、何をするのかを知らなければcH1、アプローチを推奨することは不可能です。
dynamic_castよりクリーンで柔軟性がありますが、少し遅くなります。
dynamic_cast返されたポインタのNULLをチェックするために使用するときは覚えておいてください。