2016-03-25 21 views
0

私はダウンキャストの方法をよく理解していません。どうやら私はこのようにすることはできません...ダウンキャストの明確化が必要

class myType 
{ 
}; 

class otherType : public myType 
{ 
}; 

int main() 
{ 
    myType* obj = new myType; 

    otherType* castObj = dynamic_cast<otherType*>(obj); 

    delete obj; 
} 

私は何が欠けていますか?

+0

あなたが「広い」タイプに「小さい」タイプからキャストしようとしている、それは私がより良いアナロジーを提供することができます –

答えて

0

私は思っていることがいくつかあります。

クラスBがクラスAから派生したとき、以下が成り立つ:

  • Bあなたはポインタを保持している場合はA
  • Aは必ずしもB

ではありませんBへのdynamic_castを試みることによって、BのA部分であるかどうかを確認することができます。そのキャストが成功するのは、実際にBのAインターフェースを指していたからです。キャストが成功しない場合、あなたはを指したA-ようなものだから実際B.

ませんでした:

struct A { 
    virtual ~A(); 
};  // a base class 

struct B : A {}; // a B is an A but an A is not necessarily a B 

A* pa = new A; 
// pa is pointing to an A 

B* pb = dynamic_cast<B*>(pa); 
// pb will now be NULL because this cast will have failed. 
// Remember, a B *is an* A, but an A *is not necessarily a* B 

delete pa; 

// try again... 
pa = new B; 
// pa points to the A-part of a B, so 

pb = dynamic_cast<B*>(pa); 
// pb now points to the same object, but has access to all the methods on the B interface 

delete pb; 
// clean up 
0

は、これは私が私のガールフレンドにこれを説明したい方法です:

何かがであることは間違いなく車輪があることを意味します。

ホイールとは必ずしもとは限りません。

class A 

Class B: public A 

確実Class BClass Aのすべての特性を持っており、おそらくいくつかのより多くの、私たちは常に安全に(それをキャスト)に変換することができます

たちはクラスを持っていると言いますClass Aに転送します。 は真ではありません。特定のClass Aにはと同じ型番がキャストしようとしているクラス(この場合はClass B)になります。このため、dynamic castを使用して、このリスクを認識していることをコンパイラーに通知する必要があります。

キャストが成功した場合、dynamic_castはnew_type型の値を返します。キャストが失敗し、new_typeがポインタ型の場合、その型のnullポインタを返します。キャストが失敗し、new_typeが参照型の場合は、std :: bad_cast型のハンドラに一致する例外がスローされます。

+0

をダウンキャストされていない:**犬であること 何か**、間違いなく**なります動物**。 何か**動物**は必ずしも**犬** – Vucko

+0

私はそれらの何百万を持っているが、あなたはポイントを取得しません。そして、今私は自分自身に話している: - D – Vucko

関連する問題