1. ホーム
  2. c++

[解決済み] ベース・クラス・ポインタは派生クラス・オブジェクトを指すことができます。なぜ、その逆ができないのでしょうか?

2023-04-20 03:18:38

質問

ベースクラスのポインタは派生クラスのオブジェクトを指すことができます。なぜキャストしないとその逆が成り立たないのでしょうか? 論理的には、ベースクラスは派生クラスの十分な情報を持っていませんが、派生クラスはベースクラスの情報も持っているはずです。 私はここでいくつかの基本的なことを見逃しています。

どのように解決するのですか?

私が犬を飼っていると言えば、ペットを飼っていると考えて間違いないでしょう。

もし私がペットを飼っていると言ったら、その動物が犬かどうかはわかりませんし、猫かもしれないし、もしかしたらキリンかもしれません。いくつかの追加情報を知らなければ、私が犬を持っていると安全に仮定することはできません。

同様に派生オブジェクトは基底クラスオブジェクトであり(サブクラスであるため)、基底クラスポインタによって指し示すことができます。しかし、ベースクラスオブジェクトは派生クラスオブジェクトではないので、派生クラスポインタに代入することはできません。

(これから聞こえるきしむ音は、この例えが伸びることです)

今、あなたが私のペットにプレゼントを買いたいと思ったとします。

最初のシナリオでは、あなたはそれが犬だと知っているので、私にリードを買うことができ、みんなハッピーです。

2つ目のシナリオでは、私は自分のペットが何であるか教えていないので、とにかく私にプレゼントを買おうとしているならば、私が教えていない情報を知る必要があり(あるいは推測するだけでも)、あなたは私にリードを買い、私が本当に犬を飼っていたことが判明すれば、みんながハッピーになります。

しかし、もし私が実際に猫を持っていたなら、私たちは今、あなたが間違った仮定をしたことを知り(キャスト)、鎖につながれた不幸な猫を持つことになります(ランタイムエラー)。