dynamic_cast 演算子は、実行時に型変換を実行します。
dynamic_cast
演算子によって、基底クラスへのポインターが派生クラスへのポインターへと確実に変換されるか、
または基底クラスを参照する左辺値が派生クラスへの参照へと確実に変換されます。
これにより、プログラムはクラス階層を安全に使用することができます。この演算子と
typeid 演算子は、C++ における RTTI (run-time 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 : 12FF6C Address of bobj: 12FF6C
dynamic_cast 演算子の主目的は、 タイプ・セーフな downcasts を実行することです。 downcast は、クラス A を指すポインターまたは参照を、 クラス B を指すポインターまたは参照に変換します。 このクラス A は、B の基底クラスです。downcast には、型 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 演算子は、 ポリモアフィック・クラスから生成された実行時の型情報を使用します。
関連参照