・アップキャスト
継承関係の下から上へのキャスト…ネズミ→動物
安全
暗黙のキャストが可能
・ダウンキャスト
継承関係の上から下へのキャスト…動物→ネズミ
危険
http://www.kishiro.com/programming/cpp/downcast.html
・ダイナミックキャスト
ダウンキャストを実現する
// スーパークラス Animal , サブクラス Rat
Animal animal;
dynamic_cast<Rat*>(animal); // サブクラス Rat* へダイナミックキャスト
E e; B *bp = &e;
E *ep = (E*)bp; ep->g();
というコードは動作しますが、
D d; B *bp = &d;
E *ep = (E*)bp; ep->g();
は、epが指す先がクラスEではないので、コンパイルは出来ますがまともに動作しません。
dynamic_cast は正しくキャスト可能かどうかチェックできますから、
bpが
> E e; B *bp = &e;
> D d; B *bp = &d;
のどちらの場合でも
E *ep = dynamic_cast<E *>(bp); if (ep != NULL) {ep->g();}
というコードは問題なく動作します。
このように、派生したクラスを派生元クラスのポインタで管理しているときにはクラスチェックとして dynamic_cast が使えます。
投稿日時 - 2009-12-19 13:05:16
継承関係の下から上へのキャスト…ネズミ→動物
安全
暗黙のキャストが可能
・ダウンキャスト
継承関係の上から下へのキャスト…動物→ネズミ
危険
http://www.kishiro.com/programming/cpp/downcast.html
・ダイナミックキャスト
ダウンキャストを実現する
// スーパークラス Animal , サブクラス Rat
Animal animal;
dynamic_cast<Rat*>(animal); // サブクラス Rat* へダイナミックキャスト
E e; B *bp = &e;
E *ep = (E*)bp; ep->g();
というコードは動作しますが、
D d; B *bp = &d;
E *ep = (E*)bp; ep->g();
は、epが指す先がクラスEではないので、コンパイルは出来ますがまともに動作しません。
dynamic_cast は正しくキャスト可能かどうかチェックできますから、
bpが
> E e; B *bp = &e;
> D d; B *bp = &d;
のどちらの場合でも
E *ep = dynamic_cast<E *>(bp); if (ep != NULL) {ep->g();}
というコードは問題なく動作します。
このように、派生したクラスを派生元クラスのポインタで管理しているときにはクラスチェックとして dynamic_cast が使えます。
投稿日時 - 2009-12-19 13:05:16