Notice : 内容無保証。禁無断転載。リンク自由。

術語解説

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

クラスの階層構造中、 派生クラスから基本クラスへのキャストを 「アップキャスト」 という。

逆に、クラスの階層構造中で、 基本クラスから派生クラスへのキャストを 「ダウンキャスト」 という。

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

"派生クラス" は "基本クラス" "である" ので、 アップキャストは安全に行うことができる。

しかし逆に、"基本クラス" は "派生クラス" とは限らないので、 ダウンキャストは常に安全に行えるとは限らない。 例えば、Bへのポインタが、実際には D1のインスタンスを指している場合、(ここまでは正当だが、) Bから D2へのダウンキャストには正当性が無く危険である。

C++ でのアップキャストは暗黙に行われるので、ソース中に明示する必要は無い。

一方、ダウンキャストは、実行時にしか正当性を判定できないため、 C++ でダウンキャストを安全に行うには、一般に実行時型識別 (RTTI) 機能を使った、dynamic_cast を使用する。

クロスキャスト

多重継承が行われている際に、 ある基本クラスから別の基本クラスへキャストすることを 「クロスキャスト」 という。

クロスキャスト

クロスキャストは、ダウンキャストアップキャストの組み合わせと考えることがでる。 例えば、B1から B2へのクロスキャストは、 B1から Dへのダウンキャストと、 Dから B2へのアップキャストを順に行ったものとなる。 クロスキャストは本来関連の無いクラス間でのキャストであり、 ダウンキャストと同様、キャストの正当性が失われる危険性を持っている。

C++ でクロスキャストを行う場合、static_cast を用いることはできない。 コンパイル時にはクラス間の関係を解決できないために、コンパイルエラーとなってしまう。 旧来の Cスタイルのキャストでは、コンパイルは通るが、 多重継承によって起こるポインタのずれを調整できないため誤った値を返すという、 さらに悪い結果が待っている。

C++ でクロスキャストを安全に行うには、ダウンキャストと同様、 一般に実行時型識別 (RTTI) 機能を使った、dynamic_cast を使用する。

キャストのサンプルプログラム

cast_sample.cpp

インタフェース

COM (Component Object Model)

COM は、Microsoft が提唱しているプログラミングの規則である。 インタフェースに関わる部分のさわりを紹介する。

COM

利点
実装クラスへの新規インタフェースの追加が、既存インタフェースの変更無しに行える。 このため、ユーザが新規インタフェースを必要としないならば、 ユーザのソースプログラムの変更が必要無いのはもちろん、 再コンパイルさえ無しに新たな実装クラスを使用することができる。 例えば、実装クラスの提供者と、それを使用するプログラムの作成者が異なっているような場合、 旧来のインタフェースに手を加えないならば、双方を独立にバージョンアップできることになる。 Windows プログラミングにおいて、DLL (実装クラス) と EXE (実装クラスのユーザ) とで 提供者が異なるのは一般的なことであり、この "再コンパイル無しでバージョンアップできる" という性質は大きなメリットである。
欠点
複数のインタフェースを実装したクラスを使用する場合、インタフェースを使い分けるためには あるインタフェースから別のインタフェースへのクロスキャストが必要になる。 このため、コンパイラ依存の実行時型識別 (RTTI) 機能 を使うか、 あるいはインタフェース間の変換を行う機能を実装クラスの提供者が自前で用意することになってしまう。 COM では バイナリレベルの再利用まで考慮しているため、RTTI を使っていない。 その代わり、インタフェース解決用の QueryInterface というインタフェースが IUnknown に用意されており、 実装クラスで QueryInterface の実体を用意する必要がある。