実行時型情報
Object Pascal には、RTTI を扱う言語構文があります。C++ に対応するものもあります。これらを次の表に示します。
RTTI の例(Object Pascal を C++ にマッピングした場合)
Object Pascal の RTTI | C++ の RTTI |
---|---|
if Sender is TButton (* ... *)
|
if ((dynamic_cast<TButton*>(Sender)) != NULL)
// dynamic_cast returns NULL on failure
|
b := Sender as TButton;
(* raises an exception on failure *)
|
TButton& ref_b = dynamic_cast<TButton&>(*Sender);
// throws an exception on failure
|
ShowMessage(Sender.ClassName);
|
ShowMessage(typeid(*Sender).name());
|
表中の ClassName は、宣言された変数の型に関係なく、オブジェクトの実際の型の名前を含む文字列を返す TObject メソッドです。TObject に導入されている他の RTTI メソッドは、C++ にはありません。これらはすべて public です。次に一覧を示します。
- ClassInfo は、オブジェクト型の実行時型情報(RTTI)へのポインタを返します。
- ClassNameIs は、オブジェクトが特定の型の一部かどうかを決定します。
- ClassParent は、クラスのすぐ上の上位クラスの型を返します。TObject は親を持たないため、TObject の場合、ClassParent は nil を返します。is 演算子、as 演算子、および InheritsFrom メソッドに使用されます。
- ClassType は、オブジェクトの実際の型を動的に決定します。Object Pascal の is 演算子 および as 演算子が、内部で使用します。
- FieldAddress は、RTTI を使用して、公開フィールドのアドレスを取得します。ストリーミング システムが内部で使用します。
- InheritsFrom は、2 つのオブジェクトの関係を決定します。Object Pascal の is 演算子 および as 演算子が、内部で使用します。
- MethodAddress は、RTTI を使用して、メソッドのアドレスを検索します。ストリーミング システムが内部で使用します。
TObject のこれらのメソッドのうちいくつかは、主に、コンパイラやストリーミング システムが内部で使用するためのものです。