dynamic_castについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
SUE
記事: 41
登録日時: 7年前

dynamic_castについて

#1

投稿記事 by SUE » 7年前

なんだかんだでこれが初質問になります。SUEです。

C++には基底クラスのポインタ→派生クラスのポインタ、というダウンキャストを行うdynamic_castがありますよね。これについてなのですが、ネットで情報を集めたところ、どうやら基本的に推奨されない機能だということが判りました。確かに、実行時判定する分遅いですし、そのために無駄な容量を食うことりもなります。

じゃあ自分で安全確保の機能を作って(容量は諦めるとして)static_castをすればいいんじゃね、と思ったのですが、さらに調べると、ダウンキャストそれ自体が推奨されないものだと判りました。

ダウンキャストをする事にも一応意味はあるし、普通にvirtualつき関数を作るのとも棲み分けはできると思うのですが、何故なのでしょう。それなりのオブジェクト指向の思想的理由があるような気がするのですが、思いあたる節がありません。どなたかお教えください。
オフトピック
これが解決すればシステムが完成するッ・・・!
pop'n music 20 fantasia ポップンクエストPhase MAX Ⅱ ムラクモ/少年は空を辿る【Power Of Nature】

アバター
DVDM
記事: 38
登録日時: 9年前
住所: 大阪
連絡を取る:

Re: dynamic_castについて

#2

投稿記事 by DVDM » 7年前

>>SUE さん
遅いと言っても特に気にするほどではないと思います。

スーパークラスからサブクラスへダウンキャストすると、
スーパークラスが知らないメンバーがサブクラスにはある可能性があるため危険になりますし、
仰っている通り、static_cast を使ってキャストすることは可能ではありますが多態性が失われてしまうように思います。

本当に安全が確保され、かつ意味があるのであれば使えばいいと思いますが、
やはり色々とバグの原因になったりもすると思いますので推奨はされないのではないでしょうか。

アバター
GRAM
記事: 164
登録日時: 9年前
住所: 大阪

Re: dynamic_castについて

#3

投稿記事 by GRAM » 7年前

そもそもどういった場合にダウンキャストが必要になるのでしょうか?
「オブジェクト指向の思想的理由」かどうかはわかりませんが、
通常はアップキャストしてしまったら、基底クラスのポインタもしくは参照からは
どの派生クラスからアップキャストされたものかわからないような使い方をするものなのでは?
(アップキャストしたら抽象化されてしまうから、ふつうそのキャストは非可逆になるはず。)

・・・しかしどうなんでしょう?オブジェクト指向を無視して単に使い方だけ考えれば、
確実にダウンキャストが安全でチェック機構が要らないような実装もありそうな気がします。

たとえば
①抽基底クラスのテンプレート引数に派生クラスを入れて、基底クラスのメンバ関数でダウンキャスト
(オブジェクト指向的にどうかはおいておいて)
一応実験してみました
► スポイラーを表示
・・・まぁvirtualを使わない分サイズは減るのかな?w汎用性はすごく低そうですが・・・


その②
基底クラスのプロテクテッドなメンバに派生クラスからアクセスする。
こっちの方が幾分か実用的な気もします。(やはりオブジェクト指向的にどうかはおいておいて)
► スポイラーを表示
※メモリーリークへの突込みはなしでw
実は自分の場合こっちの方は結構使いますが、若干罪の意識に駆られながら使ってたりします・・・
これ使うと有限状態機械の設計が超楽ちんなんですよね。(containerでポインタをたくさん使う代わりにポインタ一つだけを使えばいい)
最後に編集したユーザー GRAM on 2012年2月24日(金) 09:20 [ 編集 2 回目 ]

アバター
SUE
記事: 41
登録日時: 7年前

Re: dynamic_castについて

#4

投稿記事 by SUE » 7年前

DVDMさん、ご意見ありがとうございます。で、いろいろ考えていたため若干放置っぽくなってしまいました。すみません。
GRAM さんが書きました:そもそもどういった場合にダウンキャストが必要になるのでしょうか?
ええとですね、継承でまとめたいクラスがあるけど、それぞれが独自にメンバをたくさん持ってたりする時、ですかね。いや、だったら最初から継承させるな、という感じですが。
結局悩んだ末、今はダウンキャストなしの設計にできました(しました)。よくよく考えると、確かにダウンキャストを使うってのはどこかが間違ってる証ですよね。

僕はGRAMさんみたいにテンプレートを活用したやり方は頭がついていけない(有限機械状態(゚д゚)?みたいな)のでやりませんが、大変参考になりました。しかしダウンキャストを例にとっても
色んな方法があるもんですね。改めてC++の奥の深さに絶望させられました。だからこそ勉強のしがいもあるのですが。
pop'n music 20 fantasia ポップンクエストPhase MAX Ⅱ ムラクモ/少年は空を辿る【Power Of Nature】

閉鎖

“C言語何でも質問掲示板” へ戻る