2012-08-07 15 views
11

次のように私は私の基本クラスを持っている:C++の継承

class point //concrete class 
{ 
... //implementation 
} 

class subpoint : public point //concrete class 
{ 
...  //implementation 
} 

がどのように私はサブポイントオブジェクトにポイントオブジェクトからキャストのですか?私は次の3つを試しました:

point a; 
subpoint* b = dynamic_cast<subpoint*>(&a); 
subpoint* b = (subpoint*)a; 
subpoint b = (subpoint)a; 

これらのキャストは何が問題なのですか?

答えて

22

ポイントオブジェクトからサブポイントオブジェクトにキャストするにはどうすればよいですか?

できません。 pointに変換演算子があるか、またはsubpointに変換コンストラクタがある場合を除き、オブジェクト型は変換の必要なしに変換できます。

呼ぶオブジェクトが実際にタイプsubpointのあった場合は、subpoint参照(またはポインタ)をpoint参照(またはポインタ)からキャストできます

subpoint s; 

point & a = s; 
subpoint & b1 = static_cast<subpoint&>(a); 
subpoint & b2 = dynamic_cast<subpoint&>(a); 

最初(static_cast)もっと危険です。変換が有効であることのチェックがないので、asubpointを参照していない場合、b1を使用すると、定義されていない動作が発生します。

2番目(dynamic_cast)はより安全ですが、pointがポリモーフィックである場合(すなわち、仮想関数がある場合)のみ動作します。 aが互換性のない型のオブジェクトを参照する場合、例外をスローします。

+0

実際にキャストされるオブジェクトは、サブポイント型であり、ポイントの配列内にあります。 – CodeKingPlusPlus

0

asubpointにすることはできません。その実装はそこにはありません。

0

これらのキャストにはどのような問題がありますか?

あなたがそれらを実行しようとしたという事実。 pointsubpointではありませんが、うまくいけば驚いています。

1

pointsubpointではないため、全体的にこれは機能しません。その逆だけが真です。しかし、他にも問題があります。ために


subpoint* b = dynamic_cast<subpoint*>(&a); 

dynamic_castのみ多型のタイプ、すなわち、少なくとも1つの仮想関数を宣言型で動作します。私の推測では、pointには仮想機能がないため、dynamic_castと一緒に使用することはできません。

subpoint* b = (subpoint*)a; 

このキャストが機能するために


pointニーズが point::operator subpoint *()、例えば、 subpoint *への変換演算子を宣言します。仕事にこのキャストのために


subpoint b = (subpoint)a; 

、ポイントがpointからパラメータ変換可能を取るコンストラクタを持つことがsubpointまたはsubpointのニーズに変換演算子を宣言する必要があります。

2

最初の例では、dynamic_castは、基本クラスに少なくとも1つの仮想メソッドがある場合にのみ機能します。オブジェクトが実際にキャストしようとしている型のオブジェクトでない場合は、NULLになります。

aの代わりに&aが必要ですが、オブジェクトタイプが間違っているため未定義の動作が発生することがあります。

第3の例では、コピーを作成中にpointに変換するにはoperator subpoint()メソッドが必要です。

+1

@MooingDuckを、 "動作しません" を定義しますか?それは期待された結果ではないかもしれないが、コンパイルして有用な何かをするNULLポインタを返さなければなりません。 –

+0

答えが間違っているはずです。 –

1

動的キャストの目的は、「オブジェクトが階層内の特定の型であるかどうかを実行時に確認する」ことです。だから今あなたが持っているものを見てみましょう:

  1. あなたはポイントオブジェクトを持っています。サブポイントではありません。
  2. オブジェクトがサブポイントの場合は、動的キャストを要求しています。そうではありません。
  3. サブポイントではないため、dynamic_castは失敗します。オブジェクトがキャストしようとしているタイプではないことを伝える方法です。これとは対照的に

、これは働いているだろう:

subpoint c; 
point *a = &c; 
subpoint* b = dynamic_cast<subpoint*>(&a); 
subpoint* b = (subpoint*)a;