はじめに

オブジェクト指向の多態性を多用したプログラミングでは、サブクラスのインスタンスをスーパークラスのポインタ型に格納して扱うことが一般的ですが、プログラム中でサブクラス固有のメンバー変数やメソッドを呼び出すために、スーパークラスのポインタをサブクラスのポインタにキャスト(ダウンキャスト)しなくてはならない場合があります。

ここでは、このダウンキャストを安全に行う方法について説明します。

「dynamic_cast」テンプレートの利用

通常のポインタ同士のキャストでは、ポインタがメモリアドレスそのものである為に、その中に格納されたデータが何なのかの精査までは行われません。
(キャスト元のポインタが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演算子」が用意されています。


あなたの探し物は見つかりましたか?
まさにこれだ
参考になった
ちょっと違う
これじゃない

何かメッセージがあればお願いします

このメッセージを非公開にする

ご注意

・頂いたメッセージは管理者のチェックの後、公開されます。
・メッセージの公開を希望されない場合には、「このメッセージを非公開にする」にチェックを入れてください。
・管理者が不適切と判断したメッセージは公開しませんので、予めご了承ください。


まさにこれだ
1 (100%)

表示できるメッセージはありません。