クラスのキャスト
ここではクラスにおけるキャストについて解説します。
クラスのインスタンスを生成する際、変数の宣言と同じように記述できますね。
なので変数と同様に型の変換も出来るのではないかと考えられそうです。
しかし、クラスはそれぞれ固有のメンバを持っており、別のクラスにそのままコピーするのは難しそうです。
では、継承先と元のクラスならどうでしょうか。
共通するメンバを持っているので出来そうですね。
C++には仮想関数を持つクラスのポインタとその派生クラスのポインタの変換する機能があります。
アップキャスト
仮想関数を持つクラスのポインタとその派生クラスのポインタにおいて、派生クラスのポインタを基本クラスのポインタに変換することをアップキャストと言います。
派生クラスは基本クラスの全てのメンバを継承しているのでこちらは簡単ですね。
以下の構文で変換することが出来ます。
static_cast<【変換先の型】>(【キャストするインスタンス】)
この演算でキャストしたポインタが返されるので代入して使いましょう。
変換先の型はポインタ型または参照型、キャストするインスタンスも勿論あるクラスのポインタになります。
この変換は単純に行うことが出来る為、暗黙的な型変換も使うことが出来ます。
upcast_sample.c++
A *pa; B *pb; pa = pb;
この様に代入するだけで変換が出来ます。
ダウンキャスト
問題になるのは仮想関数を持つクラスのポインタをその派生クラスのポインタに変換するダウンキャストの場合です。
派生クラスには基本クラスに無いインスタンスを持っている可能性があるので、意図しない動作を引き起こす可能性があります。
この場合は暗黙的な型変換が出来ず、キャスト演算子を用いる必要があります。
アップキャストのstaticに対し、ダウンキャストはdynamicキャストを使います。
dynamic_cast<【変換先の型】>(【キャストするインスタンス】)
使い方はアップキャストと同様です。
dynamic_cast演算子は呼び出し時に型チェックを行う為エラー検出に使えます。
ポインタ型の変換に失敗した場合はNULLポインタ、参照型の変換に失敗した場合はbad_cast例外がthrowされます。
例外については例外処理の基礎を参照。
dynamic_castは使用直後にif文でエラーチェックを行うようにしましょう。