「型変換」の版間の差分

削除された内容 追加された内容
編集の要約なし
編集の要約なし
66行目:
ダウンキャストはアップキャストの逆で、基底クラスから派生クラスへの型変換、すなわち<tt>Base</tt>のインスタンスを<tt>Derived</tt>に変換する操作である。<tt>Base</tt>のインスタンスは必ずしも<tt>Derived</tt>のインスタンスとは限らないので、この変換は一般に安全ではなく、エラーが発生する可能性がある。そのため、多くの言語ではキャスト構文による明示的な変換の記述が必要である。通例、[[オブジェクト指向プログラミング]]では[[ポリモーフィズム]]を使うべきであり、ダウンキャストおよびクロスキャストが必要になるということはプログラムの設計に問題があることを示唆している。
 
[[C++]]では、安全なダウンキャストのために<code>dynamic_cast</code>という特別な構文が用意されている。この構文では、[[実行時型情報]]を参照し、ポインタ間の変換が失敗すると結果として<tt>[[ヌルポインタ#C++|NULL]]</tt>が返る。参照間の変換が失敗すると<code>std::bad_cast</code>例外がスローされる。<code>dynamic_cast</code>を使用するためには、型に[[仮想関数テーブル]]が必要となる。つまり、基底クラスに少なくとも1つの仮想関数を持つ必要がある。確実に成功することが分かっているダウンキャストの場合は<code>static_cast</code>で代用でき、これは<code>dynamic_cast</code>よりも実行時コストが小さくなるが、失敗する可能性のある場合には使えない<ref>[https://ja.cppreference.com/w/cpp/language/dynamic_cast dynamic_cast 変換 - cppreference.com]</ref>。単一継承の場合はダウンキャストにC言語形式のキャスト構文を使うこともできるが、多重継承の場合はダウンキャストに<code>dynamic_cast</code>または<code>static_cast</code>を使う必要があり、またどの基底クラスへのポインタにキャストするかによって結果アドレスが変化しうる。
 
[[Java]]では、ダウンキャストに失敗すると{{Javadoc:SE|name=java.lang.ClassCastException|java/lang|ClassCastException}}例外がスローされる。C++の<code>dynamic_cast</code>に相当する機能は存在しないが、<code>instanceof</code>演算子で型情報を問い合わせることはできる。