2016-10-18 9 views
-2

をキャスト、私は次のクラスがあります。C++多重継承と

class A { }; 
class B { 
public: 
B(){} 
virtual ~B(){}; 
}; 
class B1 : public B{ 
public: 
B1(){} 
virtual ~B1(){}; 
}; 
class B2 : public B{ 
public: 
B2(){} 
virtual ~B2(){}; 
}; 
class C1 : public A, public B1{ 
public: 
C1(){} 
virtual ~C1(){}; 
}; 
class C2 : public A, public B2{ 
public: 
C2(){} 
virtual ~C2(){}; 
}; 

私はタイプBのオブジェクトは、タイプAのもあるかどうかを知りたい:

B*b = new C1(); // or new B, or new C2 ... 

    if(dynamic_cast<A*>(b)) 
    { 
    ... 

が正しい方法私のdynamic_castですそれをコンパイルして実行しますか? ありがとうございます。

+0

あなたのキャストは無効だと思います。 AとBはお互いの子を持つからといって、お互いにキャストできるわけではありません。 – AntoineB

+0

'b'は' B * 'として宣言していますが、' new C1() 'で作成されているので、正当に' A * 'であり、あなたのコードは動作します。 'new B()'を実行しようとすると、これは失敗します。 'C1'は' A'から継承しますが、 'B'は継承しません。 –

答えて

0

dynamic_castを使用できるようにするには、オブジェクトのすべての親が多型である必要があります。私。 Aクラス(デストラクタなど)に少なくとも1つの仮想関数を追加する必要があります。

これを修正すると、dynamic_castは問題ありません。

0

クラスAは、C++タイプシステムのクラスBとは異なります。彼らは両方とも空であるので、それらは同じであるべきですが、彼らは記憶にinstathiatedされています。空のクラスでさえ、identityプロパティを持ちます。

dynamic_cast<new_type> (expression)は、通常、dynamic_cast<derived_type> (myBase)として使用されます。この場合、 "expressionが多態型Baseへのポインタまたは参照で、new_typeが型Derivedのポインタまたは参照である場合、実行時検査が実行されます:" cppreference.com dynamic_castの検索を参照してください。これにより、基底クラスを派生クラスにキャストすることができます。プログラマは、派生クラスが存在することを知る必要があります。

+0

if文の本体はすべての有効なポインタがゼロではないので実行されますが、dynamic_cast <>()が失敗した場合は0が返され、結果を確認する方法は適切です。キャストが失敗し、new_typeが参照型であれば、例外をスローします。キャストが成功した場合は、new_type型の値を返します。これは型std :: bad_castのハンドラと一致します。 –

+0

ありがとう、私は私の答えを修正します – Gregg