2

C++ でオブジェクトをダウンキャストすることに疑問があります。

ここに例があります:

class A { }
class B : public A { 
  public:
    void SetVal(int i) { _v = i; }
  private:
    int _v;
}

A* a = new A();
B* b = dynamic_cast<B*>(a);
b->SetVal(2);

この例ではどうなるでしょうか。子クラスのように基本クラスを変更しています...メモリに関連してどのように機能しますか?

このキャストでは... B のインスタンスを作成し、A の値をコピーするようなものですか?

ありがとう

4

2 に答える 2

6
A* a;

これは、へのポインタを与えるだけですA。特にどこかを指すわけではありません。AまたはBオブジェクトをまったく指していません。コードが機能するかどうかは、それが指しているオブジェクトの動的タイプによって異なります。

そのため、知りたい状況が 2 つあります。まず、これ:

A* a = new A();
B* b = dynamic_cast<B*>(a);
b->SetVal(2);

dynamic_castが null ポインターを返すため、未定義の動作が発生します。オブジェクトの動的な型が実際には ではない場合、null ポインターを返しますB。この場合、オブジェクトはA. 次に、null ポインターを で逆参照しようとするとb->SetVal(2)、未定義の動作が発生します。

A* a = new B();
B* b = dynamic_cast<B*>(a);
b->SetVal(2);

オブジェクトは実際にはオブジェクトであるため、これはうまく機能しBます。動的キャストは成功し、SetVal呼び出しは正常に機能します。

ただし、これが機能するにAは、多相型でなければならないことに注意してください。そのためには、少なくとも 1 つの仮想メンバー関数が必要です。

于 2013-05-03T14:34:18.780 に答える
1

クラスはポリモーフィックではないため、使用できないため、コンパイルすることさえできませんdynamic_cast

もしそうなら、それは未定義の動作になります。

于 2013-05-03T14:35:38.503 に答える