0

サブクラスオブジェクトが基本クラスを共有している場合、サブクラスオブジェクトを別のサブクラスオブジェクトで上書きできない理由を理解しようとしています。

Letterが基本クラスであると言います。ABはサブクラスです。以下は機能していないようです。

Letter* a_p = new A();
Letter* b_p = new B();

delete a_p;
*a_p = *b_p;

私の野心は、特定の住所にあるものを変更して、問題の住所へのすべてのポインターがそれらが指すものを変更するようにすることです。上記の例では、どういうわけかa_pの「コンテンツ」をb_pの「コンテンツ」のコピーに変更したいと思います。

これはどういうわけか可能ですか?

4

4 に答える 4

4

オブジェクトのコピーを実行していて、ポインターのタイプが基本クラスである場合、サブクラスに関するすべての情報が失われます。

また、a_pを削除すると、割り当てられなくなったメモリを指して*a_p=いるため、実行が間違っています。a_p

なぜやってみませんか:a_p = b_p;

于 2013-01-02T17:53:08.260 に答える
2

提供したサンプルコードで最も顕著な間違いは、以前に削除されたポインターを逆参照することです。しかし、それらがスタック上のオブジェクトであったとしましょう。

class Base
{
};

class A : public Base
{
};

class B : public Base
{
  int a;
};

int main()
{
  A a;
  B b;
  b = a; // This gives an error
  return 0;
}

オブジェクトを、異なるメモリレイアウト(追加されたintメンバー)を持つAオブジェクトにコピーしようとしています。Bそのメンバーはどのように初期化されますか?同じ理由で、Aのオブジェクトを指すポインタを持つことは許可されていませんB。それらは異なるタイプです。

Baseこれらの2つのタイプが「同じ」である唯一の場所は、ポインターを介してそれらにアクセスする場所です。

于 2013-01-02T18:02:20.407 に答える
1

AとBはメモリ内で同じサイズではない場合があります。また、deleteは、a_pに割り当てられたメモリの割り当てを解除します。未割り当てのメモリに書き込みます。それは「未定義の振る舞い」を引き起こすでしょう

于 2013-01-02T17:56:06.197 に答える
0

あなたがポインタ値を割り当てることを探しているなら、私はあなたがそうだと思います、そしてあなたはする必要があります

a_p = b_p

いいえ*a_p = *b_p

于 2013-01-02T17:52:38.217 に答える