私は何かのさまざまなサブクラスと、それらのサブクラスのインスタンスで動作するアルゴリズムを持っていて、アルゴリズムの動作がインスタンスのサブクラスの種類によって多少異なる場合、これを行うための最も一般的なオブジェクト指向の方法です仮想メソッドを使用しています。実行時の型情報はいつ使用しますか?
たとえば、サブクラスがDOMノードの場合、アルゴリズムが子ノードを挿入する場合、そのアルゴリズムは親ノードがDOM要素(子を持つことができる)かDOMテキストt):insertChildren
メソッドは、DomNode
基本クラスの仮想(抽象)であり、DomElement
およびDomText
サブクラスのそれぞれで異なって実装されます。
もう1つの可能性は、値を読み取ることができる共通のプロパティをインスタンスに与えることです。たとえば、アルゴリズムはDomNode
基本クラスのnodeType
プロパティを読み取ることがあります。別の例では、共通のパケットヘッダーを共有するネットワークパケットの種類(サブクラス)が異なる場合があり、パケットヘッダーを読み取ってそのパケットの種類を確認できます。
私には、多くの実行時型情報を使用していない:ネットドットで
is
とas
キーワード- C++の
typeid
演算子
新しいアルゴリズムを追加するときmはサブクラスのタイプに依存しますが、クラス階層に新しい仮想メソッドを追加する傾向があります。
私の質問は、仮想関数の代わりに実行時型情報を使用するのが適切なのはいつですか?
RTTIが非難された理由は何ですか?最後の手段ですか? – ChrisW
@ChrisW、それは理解するのが難しく、実行するのがずっと遅いです。 – vava
RTTを仮想関数ポインタと同じようにvtableクラスに格納することができます。 RTTIをチェックする方法がよりローカルになっているので、なぜ理解が難しいのか分かりません。たとえば、 "if(foo is Foo)"と表示された場合、定義を調べたり調べたりすることなく、いくつかのサブクラスで仮想関数の – ChrisW