アップキャストとダウンキャスト

クラスや型のアップキャスト

  • 基本的に継承っていうのは親を引き継いで子供を作ってます

  • すなわち親に存在するpublic / protectedな変数、関数は子供に全て引き継がれます。

  • そして子供は新たなpublic / protectedな変数、関数をさらに用意できます

  • すなわち、アップキャストは子供が親として振る舞うので、全ての変数も関数も網羅しています。

  • 逆に親を子供にすると親が知らない変数や関数が存在する可能性があります。

キャストとは?

キャストとは、プログラミングにおいて、あるデータ型の変数を別のデータ型に変換する型変換のことで、ソースコードに記述して行うものを指します。

オブジェクト指向プログラミングでは、キャストによりクラスのインスタンスを、そのクラスの親子関係にあるクラスへ変換することが出来る場合があります。
子クラス(派生クラス)から親クラス(基底クラス)へのキャストを. 「アップキャスト」と呼び、
その逆を. 「ダウンキャスト」と呼びます。

ここで注意すべき点は、メモリ上における子クラスのデータ容量は、
親クラスのものよりも絶対に大きくなる点です。
これは子クラスが親クラスの性質を受け継いで作製されるので、親クラスの機能と自身の機能を併せ持つため当然と言えます。

 子クラスのデータ = 親クラスのデータ + 子クラスの固有のデータ

アップキャスト

さて、アップキャストの場合は、メモリ上の子クラスのデータの中から親クラスのデータのみを用いれば良いので問題ありません。  アップキャスト時  子クラスのデータ → アップキャスト   → 親クラスのデータ(ここだけにアクセス可) (+ 子クラスの固有のデータ)

ダウンキャスト

 ダウンキャストの時はどうなるでしょうか。  親クラスのデータ → ダウンキャスト   → 子クラスのデータ     = 親クラスのデータ(アクセス可) + 子クラスの固有のデータ(存在しないはずなのにアクセス可)  このケースでは、元々存在しなかった子クラスの固有のデータにアクセスできることになります。そのため、ダウンキャストを行う時には注意が必要です。

イメージで捉える

qiita.com