3

親クラス「base」と「base」から継承する別のクラス「派生」があります。

「派生」には1つのメソッドcH1があります。

私がこれを行う場合:

base* b = new derived();

そして、私はこれができるようになりたいです:

b->cH1();

明らかに私はできません、そして2つの解決策があります:

  • cH1をベースで純粋な仮想として宣言します。
  • またはこれを行う:

    dynamic_cast<derived*>(b)->cH1();
    

どちらがより良い習慣ですか?

4

3 に答える 3

7

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.

于 2012-09-14T15:32:58.710 に答える
2

まず、を使用するdynamic_castbaseは、少なくとも1つの仮想関数が必要です。

第二に、の使用dynamic_cast通常、設計ミスの兆候です。derivedが本当にの子である場合base、オブジェクトはオブジェクトが期待されるderived場所に立つことができる必要があります。これは通常、純粋仮想かどうかにかかわらず仮想関数を持ち、それらの一部またはすべてをオーバーライドすることを意味します。basebasederived

しかし、何をするのかを知らなければcH1、アプローチを推奨することは不可能です。

于 2012-09-14T15:33:38.233 に答える
2

dynamic_castよりクリーンで柔軟性がありますが、少し遅くなります。

dynamic_cast返されたポインタのNULLをチェックするために使用するときは覚えておいてください。

于 2012-09-14T15:30:02.907 に答える