21

次のような基本クラスがあります。

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;

これらのキャストの何が問題になっていますか?

4

7 に答える 7

38

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

できません; ただしpoint、変換演算子またはsubpoint変換コンストラクターがない限り、キャストを必要とせずにオブジェクト型を変換できます。

参照されたオブジェクトが実際に型である場合、参照(またはポインター) からpoint 参照(またはポインター) にキャストできます。subpoint subpoint

subpoint s;

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

最初の ( static_cast) はより危険です。変換が有効かどうかのチェックがないため、aが a を参照していない場合subpoint、 usingb1は未定義の動作をします。

2 番目の ( dynamic_cast) の方が安全ですpointが、ポリモーフィックな場合 (つまり、仮想関数がある場合) にのみ機能します。a互換性のない型のオブジェクトを参照すると、例外がスローされます。

于 2012-08-07T22:51:00.907 に答える
8

動的キャストの目的は、「オブジェクトが階層内の特定のタイプであるかどうかを実行時にチェックする」ことです。それでは、あなたが持っているものを見てみましょう:

  1. ポイントオブジェクトがあります。サブポイントではありません。
  2. オブジェクトがサブポイントであるかどうかを動的キャストに要求しています。そうではありません。
  3. サブポイントではないため、dynamic_castは失敗します。つまり、オブジェクトがキャストしようとしているタイプではないことを通知する方法です。

対照的に、これはうまくいったでしょう:

subpoint c;
point *a = &c;
subpoint* b = dynamic_cast<subpoint*>(&a);
subpoint* b = (subpoint*)a;
于 2012-08-08T03:15:11.350 に答える
4

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

順番に:


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

dynamic_cast多相型、つまり、少なくとも 1 つの仮想関数を宣言する型でのみ機能します。私の推測では、pointには仮想関数がないため、 では使用できませんdynamic_cast


subpoint* b = (subpoint*)a;

このキャストを機能させるには、pointへの変換演算子を宣言する必要があります。subpoint *point::operator subpoint *()


subpoint b = (subpoint)a;

このキャストが機能するには、 point が への変換演算子を宣言するsubpoint subpoint、 から変換可能なパラメーターを受け取るコンストラクターを持つ必要がありますpoint

于 2012-08-07T22:36:51.730 に答える
1

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

于 2012-08-07T22:28:53.663 に答える
1

これらのキャストの何が問題になっていますか?

あなたがそれらをやろうとしているという事実。Apointは ではありませんsubpoint

于 2012-08-07T22:28:58.603 に答える