Essential c++ の章 5.10 ランタイム タイプの識別を読んでいるときに、問題が発生しました。最初に少し背景を紹介させてください。という名前の基本クラスとから派生しnum_sequence
たクラスがあります。基本クラスには名前付きの仮想関数があり、派生クラスには独自の定義があります。Fibonacci
num_sequence
gen_elems
以下、本より。
Fibonacci fib;
num_sequence *ps = &fib;
ps->gen_elems(64);
gen_elems() の Fibonacci インスタンスが呼び出されることがわかっています。ただし、このテストから ps が Fibonacci クラス オブジェクトをアドレス指定することがわかっていますが、ps を介して gen_elems() の Fibonacci インスタンスを直接呼び出そうとすると、コンパイル時エラーが発生します。
ps->フィボナッチ::gen_elems(64); //コンパイル時エラーが発生する
ps は、それがアドレス指定するオブジェクトのタイプを知りません。たとえ、私たちと typeid および仮想関数メカニズムが知っていたとしてもです。
gen_elems() の Fibonacci インスタンスを呼び出すには、Fibonacci
ps
型のポインターに変換するようにコンパイラーに指示する必要があります。static_cast と dynamic_cast の両方がこの仕事を行うことができます。
太字で迷っています。ps->gen_elems(64)
のフィボナッチ インスタンスを実際に呼び出しますgen_elems()
。static_cast と dynamic_cast を使用して、それをフィボナッチ型のポインターに変換する必要があるのはなぜですか?