dynamic_cast
クラス階層全体で「クロスキャスト」を行うために使用することは合法であることを私は知っています。たとえば、次のようなクラスがある場合:
A B
\ /
C
A*
タイプのオブジェクトを指すポインタがある場合はC
、次を使用できます。
A* aPtr = /* ... something that produces a C* ... */
B* bPtr = dynamic_cast<B*>(aPtr);
私が指しているB
ベースオブジェクトへのポインタを取得します。C
C
私がこれに言及する理由は、私が上記のコードを書いている時点で、コンパイラーがの定義を見たとしても、それがまだ見られていない可能性があるためA
ですB
。A
これは、コンパイラがとの間の接続を検出しない可能性があることを意味しますが、クラスが存在し、ある状況下で成功するB
可能性があるため、とにかくコードをコンパイルする必要があります。C
dynamic_cast
問題は、これは、間違ったタイプのオブジェクトに誤ってクロスキャストする可能性があることを意味します。次のようなクラスがあるとします。
A B D
\ /
C
ここに、D
いくつかのランダムな無関係のクラスがあります。私がこのようなものを書こうとすると:
A* aPtr = /* ... get a C* pointer ... */
D* dPtr = dynamic_cast<D*>(aPtr);
とdynamic_cast
に接続する方法がないため、これは実行時に常に失敗します。を使用するつもりだったために誤って使用した場合、コンパイラは、意味のないキャストがあることをまったく示しません。A
D
D
B
私の質問は、キャストが実行時に常に失敗することをコンパイラに警告させる方法はありますか? 言語レベルのソリューション、またはこれを検出できる主要なコンパイラーのコンパイラー設定に満足しています。外部ツールがある場合は、それでも問題ありません。このクラスのエラーをキャッチできるかどうかを知りたいだけです。