dynamic_cast 演算子は、実行時に型変換を実行します。dynamic_cast 演算子によって、基底クラスへのポインターが派生クラスへのポインターへと確実に変換されるか、 または基底クラスを参照する左辺値が派生クラスへの参照へと確実に変換されます。 それによって、プログラムはクラス階層を安全に使用することができます。 この演算子と typeid 演算子は、C++ における RTTI (runtime type information) サポートを提供します。
式 dynamic_cast<T>(v) は、式 v を型 T に変換します。 型 T は、完全クラス型を指すポインターまたは参照、 あるいは void を指すポインターでなければなりません。 T がポインターであって、dynamic_cast 演算子が失敗した場合、 演算子は、型 T のヌル・ポインターを戻します。 T が参照であって、dynamic_cast 演算子が失敗した場合、 演算子は、例外 std::bad_cast を throw します。 このクラスは、標準ライブラリー・ヘッダー <typeinfo> の中で検出することができます。
dynamic_cast 演算子は、実行時型情報 (RTTI) の生成を要求します。これは、コンパイラー・オプションによっ てコンパイル時に明示的に指定する必要があります。
T が void ポインターの場合、dynamic_cast は、v が指すオブジェクトの開始アドレスを戻します。次の例は、このことを示しています。
#include <iostream> using namespace std; struct A { virtual ~A() { }; }; struct B : A { }; int main() { B bobj; A* ap = &bobj; void * vp = dynamic_cast<void *>(ap); cout << "Address of vp : " << vp << endl; cout << "Address of bobj: " << &bobj << endl; }
この例の出力は、次の出力に似ています。 vp および &bobj の両方とも同じアドレスを参照します。
Address of vp : SPP:0000 :1aefQPADEV0001TSTUSR 369019:220:0:6c Address of bobj: SPP:0000 :1aefQPADEV0001TSTUSR 369019:220:0:6c
dynamic_cast 演算子の主目的は、 型が安全な downcasts を実行することです。 ダウン・キャストは、クラス A がクラス B の基底クラスである場合に、 クラス A へのポインターまたは参照を、クラス B へのポインターまたは参照に変換することを指します。 ダウン・キャストの問題は、型 A* のポインターが、A から派生されているクラスの任意のオブジェクトを指すことができ、また指す必要がある点にあります。 dynamic_cast 演算子を使用すると、クラス A のポインターをクラス B のポインターに変換する場合に、 A が指すオブジェクトが、クラス B または B から派生されるクラスに確実に属するようになります。
以下の例は、dynamic_cast 演算子の使用法を示したものです。
#include <iostream> using namespace std; struct A { virtual void f() { cout << "Class A" << endl; } }; struct B : A { virtual void f() { cout << "Class B" << endl; } }; struct C : A { virtual void f() { cout << "Class C" << endl; } }; void f(A* arg) { B* bp = dynamic_cast<B*>(arg); C* cp = dynamic_cast<C*>(arg); if (bp) bp->f(); else if (cp) cp->f(); else arg->f(); }; int main() { A aobj; C cobj; A* ap = &cobj; A* ap2 = &aobj; f(ap); f(ap2); }
上記の例の出力は、以下のとおりです。
Class C Class A
関数 f() は、ポインター arg が、型 A、B、 または C のオブジェクトを指すかどうかを判別します。 関数は、dynamic_cast 演算子を使用して、arg を、型 B のポインターへ、 次に型 C のポインターに変換しようと試みることによって、この判別を行います。 dynamic_cast 演算子が正常に行われると、arg によって表されるオブジェクトを指すポインターを戻します。 dynamic_cast が失敗すると、0 が戻されます。
downcast は、ポリモアフィック・クラスにおいてのみ、dynamic_cast 演算子を使用して、 実行することができます。 上記の例では、クラス A は、仮想関数を持っているので、 すべてのクラスはポリモアフィックです。 dynamic_cast 演算子は、 ポリモアフィック・クラスから生成された実行時の型情報を使用します。
関連情報