私はこのページを読んでいて、それは言います
dynamic_castは、オブジェクトへのポインターと参照でのみ使用できます。その目的は、型変換の結果が要求されたクラスの有効な完全なオブジェクトであることを確認することです。
しかし、これを行うと、dynamic_castは有効なオブジェクトを提供しません。
struct A{};
struct B:A{};
void main(){
A a;
B b;
B* bPtr = (B*) 0x0000001;
A* aPtr = dynamic_cast<A*>(bPtr);
//Now aPtr is the memory address 0x00000001
}
bPtrには有効なAオブジェクトが含まれていないため、dynamic_castがこのキャストに失敗し、aPtrがNULLになると予想されます。しかし、これは起こっていませんか?コンパイラ(g ++ 4.5.7)と上記のWebページのどちらが間違っていますか?または、dynamic_castが実際に何をすることになっているのかについて何かが足りませんか?
編集:回答の概要
- アップキャストでは、dynamic_castは何もしません。いかなる種類の保証もありません。
- ダウンキャストでは、dynamic_castは不正なポインタをチェックしません。ソースポインタが0であるか、有効なソースオブジェクトを指していることを前提としています。(dynamic_cast操作は、不正なポインターが与えられた場合、ダウンキャスト中にセグメンテーション違反を起こす可能性があります)
- dynamic_castによるダウンキャストには、基本クラスに少なくとも1つの仮想メンバーが必要です。