1

純粋な仮想関数を持つ基本クラスがあり、基本クラスの仮想関数と独自の関数の定義を持つ派生クラスがあります。

次のように、基本クラス オブジェクトを派生クラスに指定しました。

Base *bc =new Child();

このオブジェクトを使用して、(親で定義または宣言されていない) 子クラスのメソッドを呼び出したいと考えています。

しかし、コンパイラ エラーが発生していますmemeberFunction not define in Base class

コードは次のとおりです。

class Base
{
public:
  virtual void method1() = 0;
};

class child : public Base
{
public:
  virtual void method1() {}
  void Method2() { /* some implementation */ }
};

どうすればこれを達成できますか?

bc->Method2();
4

5 に答える 5

2

これを単独で行いたいという事実は、設計上の選択が不適切であることを示しています。ほとんどの場合、dynamic_cast の使用は設計上の選択の誤りを示しています。また、dynamic_cast は非常に遅く、仮想関数を呼び出すよりもはるかに遅いことに注意してください。ちなみに、 static_cast を使用して派生ツリーをキャストできます。もちろん、これは非常にまれです (CRTP がその例です)。また、この時点で、オブジェクトが「子」であり、他の Base-Derived オブジェクトではないことをどうやって知るのでしょうか? そして、本当にそれを知っているなら、そもそも Base* の代わりに child* を使ってみませんか? (ちなみに、unique_ptr などのスマート ポインターを見てください。)

于 2012-12-30T08:59:55.343 に答える
1

OOP の原則の 1 つは、共通の関数セットを通じて異なるオブジェクトのグループを表示する機能です。問題を解決するには、動的キャストまたは静的キャストのいずれかを使用できますが、この方法を使用することで、OOP の最も便利な側面の 1 つを窓の外に投げ出すことになります。

オブジェクトに対して右と左の多くのキャストを開始した場合、そもそも継承の階層 (ポリモーフィズム) を持つ目的は何ですか?

一般に、OOP は、階層のベースに多くの (純粋な) 仮想関数を設定する場合にうまく機能します。これらの関数の一部または多くが一部のサブクラスでは役に立たない場合でも.

于 2012-12-30T10:11:56.620 に答える
0

(dynamic_cast を使用して) にキャストbcしてからChild *、 を呼び出す必要がありますMethod2()

于 2012-12-30T08:36:56.427 に答える
0

これを行う正しい方法は、ベースクラスに Method2 を実装することです。正しい方法で実行したい場合は、ifs、buts、または代替手段はありません。間違った方法は、動作する dynamic_cast を使用することですが、それでも正しいことではありません。

基本クラスを絶対に変更できない場合は、そもそもなぜそれが基本クラスの一部ではなかったのかを自問する必要があります。クラスが子で実行できることが期待されているが、何らかの理由で基底クラスで実行できない場合は、純粋な仮想として実装するか、実装するのが正しいことに注意してください。適切な「これは探しているメンバー関数ではありません」タイプの操作を行います。

于 2012-12-30T09:19:12.383 に答える
0

物事を行う正しい方法は、何を表現しようとしているかによって異なります。クラス階層が次のとおりであると仮定します: class Animal

クラス カンガルーは動物で、ジャンプできます

アニマルポインターを使用すると、それが動物であることしかわかりません。ポインターが象を指している可能性があることはわかっているため、ジャンプさせることはできません。

あなたの3つのオプション:a)動物をまったくジャンプさせないでください(代わりにカンガルーポインターを使用してください)b)dynamic_castを使用してください。このように表現できます: カンガルーの場合はジャンプさせ、そうでない場合は c) jump() を基本クラス (動物) に追加し、Elephant::jump で例外をスローするか、何もしないようにします。

他の動物もジャンプさせたい場合、b ソリューションは非常に複雑になります。また、多くの C++ プログラマーは dynamic_cast を嫌います。

于 2012-12-30T09:40:34.783 に答える