0

動的キャスト 、 typeid() 、およびテンプレートに関していくつか質問があります

1) なぜ typeid は RTTI を必要としないのですか?

2) ポリモーフィック型の dynamic_cast:

  • RTTI でダウンキャスト (ベースから派生) を行うと、コンパイルがパスします

    RTTI がオフの場合 - 警告が表示されます (警告 C4541: 'dynamic_cast' used on polymorphic type 'CBase' with /GR-; unpredictable behavior may result)

  • アップキャスト (ベースへの派生) を行う場合、RTTI の有無にかかわらず - コンパイルはスムーズに行われます

私が理解していないのは、アップキャストを実行し、RTTI がオフになっていると、警告/エラーが表示されない理由です!

3) NON ポリモーフィック型の dynamic_cast:

  • RTTI の有無にかかわらずダウンキャストを行うと、コンパイルが失敗します (エラー C2683: 'dynamic_cast' : 'CBase' はポリモーフィック型ではありません)

しかし

  • RTTI の有無にかかわらずアップキャストを行うと、コンパイルはスムーズに行われます。

RTTI なしで NON ポリモーフィック タイプ パスのアップキャストが発生するのはなぜですか?

4) テンプレート関数の前にある「インライン」には何らかの効果がありますか? つまり、コンパイラが関数をコンパイルして「インライン」であると判断した場合、関数は実際にはインラインとして扱われますか、それとも無視されますか?

デビッドを助けてくれてどうもありがとう

4

1 に答える 1

2

1) RTTI が必要です。少なくとも多相クラスで使用している場合...これが実際の目的です。

2) dynamic_cast に RTTI がない場合、キャストしているオブジェクトが実際にキャスト先のオブジェクト タイプであるかどうかを確認できません。これが、dynamic_cast (本質的に) と static_cast の違いです。Static_cast はこれをチェックしないため、「安全」ではありませんが高速です。したがって、RTTI がない場合、ダウンキャスト時に動的キャストを行うことはできません

コンパイル時に型を決定できるため、アップキャストは安全です。したがって、基本クラスに dynamic_cast を使用してアップキャストできます。

3) dynamic_cast ダウンキャストは多形型 (たとえば、仮想関数を含む型) 用であるため、クラスが多形でない場合は機能しません。したがって、CBase に仮想関数がない場合、dynamic_cast を使用することはできません。

アップキャストの2と同じ理由。

さまざまなキャストの目的について少し読む必要があると思います。

http://www.cplusplus.com/doc/tutorial/typecasting/

4)はい、インラインとしてコンパイルします。

于 2010-05-19T18:47:11.817 に答える