0

私はこのページを読んでいて、それは言います

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が実際に何をすることになっているのかについて何かが足りませんか?

編集:回答の概要

  1. アップキャストでは、dynamic_castは何もしません。いかなる種類の保証もありません。
  2. ダウンキャストでは、dynamic_castは不正なポインタをチェックしません。ソースポインタが0であるか、有効なソースオブジェクトを指していることを前提としています。(dynamic_cast操作は、不正なポインターが与えられた場合、ダウンキャスト中にセグメンテーション違反を起こす可能性があります)
  3. dynamic_castによるダウンキャストには、基本クラスに少なくとも1つの仮想メンバーが必要です。
4

1 に答える 1

2

dynamic_cast<>適切に使用されていれば、有効なオブジェクトを提供することが保証されます。

このキャストを使用するための最初の要件は、多態的な基本クラス(少なくとも1つのvirtual関数)を持つことです。あなたの例では、は多形ではなく、コンパイルエラーが発生しますAB

2番目の要件は、ダウンキャストに使用する必要があることです。このdynamic_cast<>場合、アップキャストに使用します(これは簡単に発生します)。

それらが多形であったとすると、3番目の要件は、適切なオブジェクトへのポインター/参照でこのキャストを使用することです。
bPtr = (B*)0x0000001のオブジェクト(ほとんどはUB)を参照することは保証されていませんB

正しい例は次のとおりです。

struct A{ virtual ~A() {} };
struct B : A {};
void main(){
  A* pA = new B;
  B* pB = dynamic_cast<B*>(pA);
}
于 2012-04-19T04:54:20.647 に答える