オブジェクト指向の多態性を多用したプログラミングでは、サブクラスのインスタンスをスーパークラスのポインタ型に格納して扱うことが一般的ですが、プログラム中でサブクラス固有のメンバー変数やメソッドを呼び出すために、スーパークラスのポインタをサブクラスのポインタにキャスト(ダウンキャスト)しなくてはならない場合があります。
ここでは、このダウンキャストを安全に行う方法について説明します。
通常のポインタ同士のキャストでは、ポインタがメモリアドレスそのものである為に、その中に格納されたデータが何なのかの精査までは行われません。
(キャスト元のポインタがNULLでなければ、キャスト後のポインタもNULLにはなりません。)
スーパークラスのポインタの先に、スーパークラスのインスタンスが格納されていて、これをサブクラスのポインタにキャストしたいが、それ以外のキャスト(スーパークラスのポインタ先にスーパークラスのインスタンスが格納されていて、これをサブクラスのポインタにキャストする場合等)はキャストできないようにしたい場合には、「dynamic_cast」テンプレートを利用します。
#include <stdio.h> class Super { }; class Sub : public Super { }; void main() { Super *tSubPtr1=new Super(); Super *tSubPtr2=new Sub(); Sub *tSuperPtr1=dynamic_cast<Sub*>(tSubPtr1); Sub *tSuperPtr2=dynamic_cast<Sub*>(tSubPtr2); printf("tSuperPtr1=%d\n",tSuperPtr1); printf("tSuperPtr2=%d\n",tSuperPtr2); delete tSubPtr1; delete tSubPtr2; }
上記のように「dynamic_cast<A>(B)」と記述すると、Bで指定された変数をAの型にキャストして返します。
Bに格納されたデータがAの型のインスタンスでない等、キャストが出来ない場合にはNULLが返ります。
tSuperPtr1=0 tSuperPtr2=8858328
Superのポインタ型にSubのインスタンスを格納し、これをSubのポインタ型にダウンキャストしているtSubPtr2の場合では、NULL(=0)ではないポインタにキャストが成功していますが、その逆でSuperのポインタ型にSuperのインスタンスが格納され、これをSubのポインタ型にダウンキャストしているtSubPtr1の場合では、変換後のポインタにNULL(=0)が格納されています。
Java言語では、同様の安全なダウンキャストを行うために、「instanceof演算子」が用意されています。
・頂いたメッセージは管理者のチェックの後、公開されます。
・メッセージの公開を希望されない場合には、「このメッセージを非公開にする」にチェックを入れてください。
・管理者が不適切と判断したメッセージは公開しませんので、予めご了承ください。
まだ評価がありません |
表示できるメッセージはありません。