クラスの階層構造中、 派生クラスから基本クラスへのキャストを 「アップキャスト」 という。
逆に、クラスの階層構造中で、 基本クラスから派生クラスへのキャストを 「ダウンキャスト」 という。
"派生クラス" は "基本クラス" "である" ので、 アップキャストは安全に行うことができる。
しかし逆に、"基本クラス" は "派生クラス" とは限らないので、 ダウンキャストは常に安全に行えるとは限らない。 例えば、Bへのポインタが、実際には D1のインスタンスを指している場合、(ここまでは正当だが、) Bから D2へのダウンキャストには正当性が無く危険である。
C++ でのアップキャストは暗黙に行われるので、ソース中に明示する必要は無い。
一方、ダウンキャストは、実行時にしか正当性を判定できないため、 C++ でダウンキャストを安全に行うには、一般に実行時型識別 (RTTI) 機能を使った、dynamic_cast を使用する。
多重継承が行われている際に、 ある基本クラスから別の基本クラスへキャストすることを 「クロスキャスト」 という。
クロスキャストは、ダウンキャストとアップキャストの組み合わせと考えることがでる。 例えば、B1から B2へのクロスキャストは、 B1から Dへのダウンキャストと、 Dから B2へのアップキャストを順に行ったものとなる。 クロスキャストは本来関連の無いクラス間でのキャストであり、 ダウンキャストと同様、キャストの正当性が失われる危険性を持っている。
C++ でクロスキャストを行う場合、static_cast を用いることはできない。 コンパイル時にはクラス間の関係を解決できないために、コンパイルエラーとなってしまう。 旧来の Cスタイルのキャストでは、コンパイルは通るが、 多重継承によって起こるポインタのずれを調整できないため誤った値を返すという、 さらに悪い結果が待っている。
C++ でクロスキャストを安全に行うには、ダウンキャストと同様、 一般に実行時型識別 (RTTI) 機能を使った、dynamic_cast を使用する。
COM は、Microsoft が提唱しているプログラミングの規則である。 インタフェースに関わる部分のさわりを紹介する。