キャスト
キャストとは、プログラミングにおいて、あるデータ型の変数を別のデータ型に変換する型変換のことで、ソースコードに記述して行うものを指します。
例えば、C言語では、intからfloatへのキャストは以下の様に記載します。
float a;
int b;
a = 10.0f;
b = (int)a; //float→intへの型変換(キャスト)
「(型名)変数名」という記述によって、変数を指定したデータ型に変換できます。型変換には上記の様な記述によるデータ型の変換(明示的なキャスト)を行うものの他に、コンパイラなどの処理系により「自動的に」行われる変換(暗黙的なキャスト)があります。
データ型によってメモリ上のデータの容量が異なるため、容量の少ない型から多い型への変換を「拡大変換」と呼び、その逆を「縮小変換」といいます。拡大変換ではデータは保たれますが、縮小変換では一部の情報が損なわれたり、キャスト先のデータ型に合わせて修正されたりします。
オブジェクト指向プログラミングでは、キャストによりクラスのインスタンスを、そのクラスの親子関係にあるクラスへ変換することが出来る場合があります。子クラス(派生クラス)から親クラス(基底クラス)へのキャストを「アップキャスト」と呼び、その逆を「ダウンキャスト」と呼びます。ここで注意すべき点は、メモリ上における子クラスのデータ容量は、親クラスのものよりも絶対に大きくなる点です。これは子クラスが親クラスの性質を受け継いで作製されるので、親クラスの機能と自身の機能を併せ持つため当然と言えます。
子クラスのデータ = 親クラスのデータ + 子クラスの固有のデータ
さて、アップキャストの場合は、メモリ上の子クラスのデータの中から親クラスのデータのみを用いれば良いので問題ありません。
アップキャスト時
子クラスのデータ → アップキャスト
→ 親クラスのデータ(ここだけにアクセス可) (+ 子クラスの固有のデータ)
ダウンキャストの時はどうなるでしょうか。
親クラスのデータ → ダウンキャスト
→ 子クラスのデータ
= 親クラスのデータ(アクセス可) + 子クラスの固有のデータ(存在しないはずなのにアクセス可)
このケースでは、元々存在しなかった子クラスの固有のデータにアクセスできることになります。そのため、ダウンキャストを行う時には注意が必要です。