回答編集履歴
1
動的多態の話だけで dynamic_cast にフォーカスした説明を忘れていたので追記
answer
CHANGED
@@ -2,4 +2,14 @@
|
|
2
2
|
|
3
3
|
実行速度的な部分ではそれ自体の実行コストは小さくても**最適化を邪魔する**という性質があるので最終的な実行速度に大きく影響することはあります。 それを込みで考えても充分に速いと考えるのであればそれでも良いですが、不必要な場所であえて不利なことをする理由もないでしょう。
|
4
4
|
|
5
|
-
動的な性質は不整合がコンパイル時には検出されないことがあります。 型システムはプログラムの構造の表れであり、型の間違いはプログラムの間違いです。 実行時になるまで問題が表面化しないよりは静的型検査で問題が検出されて欲しいです。
|
5
|
+
動的な性質は不整合がコンパイル時には検出されないことがあります。 型システムはプログラムの構造の表れであり、型の間違いはプログラムの間違いです。 実行時になるまで問題が表面化しないよりは静的型検査で問題が検出されて欲しいです。
|
6
|
+
|
7
|
+
----
|
8
|
+
|
9
|
+
そして動的多態のためだけなら `dynamic_cast` は不要です。 派生型のポインタから基底型のポインタへの変換は失敗の可能性がないので `dynamic_cast` ではなく `static_cast` を使うべきですし、多くの場合には暗黙の変換で充分です。
|
10
|
+
|
11
|
+
`dynamic_cast` が必要になるのはいわゆるダウンキャスト/クロスキャストなので、これは異なる型を共通のインターフェイスで**扱えないとき**、つまり動的型を扱いながら多態として扱えないときです。 振る舞いの違いをクラスの中に押し込めることが出来ずに使う側で検査して分岐するなどの作業が必要になるので分岐条件のミスなどが入り込みやすく、拡張性にも欠けます。
|
12
|
+
|
13
|
+
C++ の設計者である Stroustrup 氏もその著書の中で動的な型を識別する仕組みを入れたくなかったと述べており、 `dynamic_cast` が表れるようなコードはアンチパターンの前兆です。 しかし動的な型を識別する仕組みを言語として用意しておかなければ、それが必要になったときプログラマは自前で型識別機構を作ってもっとひどいコードを生み出してしまうでしょう。
|
14
|
+
|
15
|
+
`dynamic_cast` が好まれないのは性能がどうこうではなく、それを使わなければならない状況が設計の失敗の可能性があるからなのです。 もちろん本当に必要な状況というのもあるのですが、日常的にたくさんあるようなものではないです。
|