2016-05-12 14 views
3

dynamic_castの基底クラスオブジェクトを派生クラスオブジェクトにキャストしようとしましたが、dynamic_castがnullを返します。 dynamic_castを使用してダウンキャストすることはできますか?dynamic_castを使用したダウンキャストが返されます。

struct A { 
    virtual ~A() {} 
}; 

struct B : A {}; 


int main() 
{ 
    A* a = new A(); 

    B* b = dynamic_cast<B*>(a); 
    if(b){ 
     std::cout << "b has value" << std::endl; 
    }else{ 
     std::cout << "no value" << std::endl; 
    } 
} 

このコードは「値なし」を表示します。

+0

FYI casting * down *継承チェーンはダウンキャストと呼ばれます。 – NathanOliver

+2

AからBを得ることはできません。 BインスタンスにはAインスタンスより多くのデータメンバーがありましたか? –

+3

'A'を' B * 'にダウンキャストすることはできません。 'B'を指していないので、' A'を指しています。 'A'は' B'ではありません。しかし、 'B *'がBを指しているので、 'A *'に 'B *'をキャストすることができます。これは "A"(継承の定義)です – KABoissonneault

答えて

14

aが実際にAを指しているため、Bではなく、dynamic_castが失敗します。

dynamic_castを使用してダウンキャストすることはできますか?

はい、可能です。発現は、ポリモーフィック型ベースへのポインタまたは参照であり、そしてnew_typeが実行派生型へのポインタまたは参照である場合Bからa点が正確に、

A* a = new B; 
B* b = dynamic_cast<B*>(a); 

)はhttp://en.cppreference.com/w/cpp/language/dynamic_cast

5を見る場合時間チェックが実行されます。

a)式で指し示された最も派生したオブジェクトが調べられます。そのオブジェクトで式が/をDerivedの公開ベースを参照し、Derivedタイプのサブオブジェクトの1つのみがexpressionで指し示され/識別されたサブオブジェクトから派生している場合、キャストポイント/の結果はその派生サブオブジェクトを参照します。 (これは "ダウンキャスト" として知られています。)

...

c)は、そうでない場合は、ランタイムチェックが失敗します。ポインターでdynamic_castが使用されている場合、new_type型のヌルポインター値が返されます。参照で使用された場合、例外std::bad_castがスローされます。

+0

ベースオブジェクトの場合は 'dynamic_cast'を使用できますか?デフォルトのctorを削除しました。静的関数 'create'でのみ作成できますか? – Herrgott

+0

@Herrgottはい。 'dynamic_cast'は、基本クラスのデフォルトのコンストラクタを伴わないポインタと参照で動作します。 – songyuanyao

4

これは、デザインあたりです。です。 dynamic_castは、基本クラスオブジェクトへのポインタが実際にサブクラスを指しているかどうかをテストする場合に使用されます。サブクラスオブジェクトの場合、dynamic_castは有効なポインタを返し、そうでなければnullptrを取得します。

Aクラスオブジェクトを作成し、ABのサブクラスでない場合、dynamic_castは通常nullポインタを返しました。

関連する問題