はい、動作します。
dynamic_cast
RTTIに基づいています。ここで RTTI によって提供される情報は、指定されたオブジェクトの実際の動的タイプを判別するのに十分です。定義上、RTTI は実行時の概念であり、指定されたオブジェクトの動的型と同様です (上記のキャストが記述されているコンパイル ユニットで Foo の定義が利用できないという事実はコンパイル時の概念であり、ここでは関係ありません)。
- 指しているオブジェクトが実際に Foo である場合、dynamic_cast は実行時に成功します。
- Abstract2 から派生したオブジェクトへのポインターでない場合、失敗します (null ポインターを返します)。
詳細
の可能な実装はdynamic_cast
、オブジェクトのメモリ レイアウトの先頭にある特別なメンバーを検索することです (または v テーブルに沿って格納できます)。この構造体には、オブジェクトの動的タイプを識別する値を含めることができます。どこかで、コンパイラは静的テーブルを生成し、プログラム継承図に関するすべての情報を複製します。実行時に、キャストはインスタンスの型識別子を抽出し、それを静的テーブルと照合します。この識別子が Abstract2 から派生した型を参照している場合、キャストは意味があります (そして、コードはAbstract2
オブジェクトのインターフェイスへの正しいオフセット ポインターを返すことができます)。
この素朴な実装でさえFoo
、キャストが書かれているコンパイル単位の知識を必要としません。