このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

C++でのキャスト

何かしらbasicでabstractなクラスBasicAbstracがあったとして、これの派生クラスDerivedConcreteもあるとする。p がBasicAbstractなインスタンスへのポインタ(参照でも)とする。一般的抽象的なレベルでは、BasicAbstractなpで作業すれば十分、という状況。

このpは、実はDerivedConcreteなインスタンスに由来する、実際のところはDerivedConcreteなんだが、派生クラス固有な特性が不要なのでBasicAbstractとみなして作業してた、と。で、DerivedConcreteな情報が必要になると、pをダウンキャストすることになる。「ダウン」というが、僕の感覚ではサブクラスほど情報量が増えるからむしろ情報量的にアップだと思う.

が、まー、それはいいとするわ。

ダウンキャストするには、DerivedConcrete* q = dynamic_cast(p); が基本。assert(q != nullprt); で確認しておけば、万が一のときにassertに引っかかる。

周辺の状況から、pが明らかにDerivedConcreteに由来するのが確実ならば、static_castでもいいと思うが、これは万が一の事故の検出が難しい。「絶対大丈夫だぜ」というプログラマの意図の表明がstatic_castだって解釈も可能だが、人間は間違えるからなー。

ウームッ。

やっぱり、実行時のオーバーヘッドをケチるよりは安全性だからdynamic_castかな。assertが「まず間違いないぞ」という意図つうか自信の表明と解釈。そもそもが危ないと認識してるなら、ポインタqを見たif分岐のロジックでプログラムのなかで処理する。

Cの生のキャストは、構文が (DerivedConcrete *) だから、grepにひっからないのが困る。当然に安全性はないし。しかし、最近も「まーいいや」と使った気がする。イカイカン。「Cスタイルの構文をなくせばいいのに」と思うけど現実的には無理か。