2011-08-15 29 views
1

A *からC *への暗黙の変換が必要です。 私はAの定義や実装を変更できません。暗黙的に異なる型間で型変換を行う

class A 
{ 
}; 

struct B: public A 
{ 
}; 

struct C: public B 
{ 

}; 

私は次のように記述:

A* p; 
C* q = p; 

私はエラーC2440を取得しています。 A *からC *に変換できません。 私はA.私は変更することはできませんという事実を与えることができますどちらのクラスも基本的なデータの単純な構造体です。

+0

Cを変更できる場合は、A *をとるコンバージョンコンストラクタを作成できます。 Aが実際にCである可能性があるのなら、dynamic_cast またはstatic_cast を使用できます。AがCでない場合は、自分のやっていることを再考してください。 –

答えて

5

あなたがこれを行うことができます唯一の方法は、キャストを使用することです:CAの誘導体であり、必ずしもすべてのACあるので

// a C++ style static_cast: 
C* q = static_cast<C*>(p); 

// or the less verbose C-style cast 
C* q = (C*)p; 

を、あなたはできるように、それは暗黙的に(キャストすることはできません,CのいずれかがAであるため(つまり、は「より小さいか同等の機能」を持つが、それ以上ではないため)C*A*に暗黙的にキャストします。

実際ににはのポインタ型間の暗黙のキャストが必要です。あなたは何をしていると思いますか?

+0

CはAの拡張構造であり、拡張部分はCのみで内部で使用されます。また、代入部分はCとAの一致メンバーのみを割り当てる必要があります。 – sramij

+1

@sramij暗黙のキャストを必要とするのは何ですか?そしてポインタはそのようには機能しません。 「Aの一致するメンバーのみを割り当てる」ことはできません。 _object_(ポインタではない)をキャストしたい場合は、変換演算子を定義できます。しかし、ポインタのためにそれを行うことはできません。 –

関連する問題