C ++では、実行時型情報(RTTI)は動的バインディングを意味しますか?
3 に答える
RTTIは、コンパイラの出力に追加情報が含まれていることを意味します。これにより、ランタイムコードは、通常はコンパイル時に破棄されるソースコードのクラスとタイプに関する詳細を知ることができます。
たとえば、マシンコードは、関数を呼び出すために関数の名前を知る必要はありません。マシンコードで関数を呼び出すには、ターゲット関数のアドレスを知る必要があるだけです。
別の例:コンパイルされたマシンコードは、実行時にクラスタイプの名前を知る必要はありません。ただし、自動シリアル化ライブラリを構築する場合は、出力ストリームに書き込むことができるように、各クラスのテキスト名を知っておく必要があります。クラス名はRTTIです。
動的バインディングとは、コンパイル時に認識されていなかったメソッドまたはプロパティを実行時に文字列名で検索して呼び出す機能を意味する場合、そうです。RTTIはその目的に使用できるリソースです。
RTTIは、実行時に参照(またはポインター)の動的タイプを決定することを意味します。
class Base {};
class Dervied : public Base {};
Base* b ; // Static type of pointer is Base*;
b = new Base(); // Dynamic type (pointed to) is Base;
b = new Derived()' // Dynaic type pointed to is Derived.
RTTIは、タイプbが実際に何を指しているか、つまり動的タイプbを把握しています。
RTTIは高価であり、形式が悪いです。
パブリック継承では、Derived is-Baseであるため、関数は動的タイプを気にする必要はありません。bがベースまたは派生を指しているかどうかに関係なく、bが指しているものに対して実行できることはすべてOKである必要があります。
関数が動的タイプを知る必要がある場合は、Baseで呼び出すことができるメソッドとして、Baseの外部で何かを実行していることを示しています。これはbaseにカプセル化する必要があります。
本当に外部で何かを行う必要がある場合(外部のものはマルチディスパッチであるため、たとえば、Visitorでそれを行うことができない場合)、少なくともRTTIの(顕著な)paetをカプセル化します。顕著なのは、それがベースであるかどうかだけだとしましょう。
class Base {
virtual bool isBase() { return true; }
};
class Dervied : public Base {
virtual bool isBase() { return false; }
}
目立つのがタイプである場合は、次のようにします。
class Base {
virtual string typeName { return "Base"; }
};
class Dervied : public Base {
virtual string typeName { return "Derived"; }
}
当然、仮想関数を追加したので、仮想dtorを追加する必要があります。つまり、(三つのルール)コピーctorとコピー代入演算子も追加する必要があります。これらは表示されていません。
いいえ。動的バインディングは、実行時に、あるコンテキストに基づいて、一連の関数のどれを呼び出すかを決定するという考えを指す、かなり緩い用語です。これは通常、仮想メンバー関数として一般に知られている基本クラスへのポインターを介して、オブジェクトの実際の型によって決定されます。
RTTIは、実行時にオブジェクトのtype_infoオブジェクトを検出するためのメカニズムです。2つの概念はある程度関連していますが、それでも互いにまったく異なります。