C ++仮想関数と仮想関数テーブルのコメント

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/saber_wtq/article/details/90691766

仮想関数を説明する前に、次の定義を区別する必要があります、過負荷に書き換え、再定義

  1. オーバーロード ---同じクラス、関数パラメータリスト内の同じ関数名が同じ2つのものではなく、二つ以上の機能は、関数のオーバーロードです。注:関数の戻り値の関数として、オーバーロードに基づいているか否か。
  2. 書き換え ---親クラスが仮想関数が覆われていた親クラスのサブクラスに継承されている場合。プログラムを書き換えること動的結合、多型の発生が生成される原因となります。
  3. 再定義し、親クラス非仮想関数のサブクラスが覆われていたとき---親クラスから継承されます。

オブジェクト指向設計言語は----多型を有します。

  • 静的ポリモーフィズム:関数のオーバーロード、演算子のオーバーロード
  • 動的なポリモーフィズム:仮想関数によって実現。
  • 静的バインディング:コンパイルプロセスを、あなたはパラメータを呼び出すように機能するかを決定するための関数をオーバーロードされて、呼び出すべき関数を知っていれば。
  • 動的バインディング:実行時バインディングを、それは仮想関数によって達成されます。
  1. あなたは非仮想関数にアクセスするためのポインタまたは参照を使用する場合は、ポインタ自体の種類に応じてコンパイラが呼び出すように機能するかを決定します。むしろに係る型よりオブジェクトへのポインタより。
  2. あなたは仮想関数にアクセスするためにポインタを使用すると、コンパイラは、ポインタの種類に応じて関係なく、ポインタ自体の種類の、呼び出すように機能するかを決定します。

派生クラスの仮想関数が基底クラス(再定義、カバー)に書き換えることができます。

  1. そして、基底クラスの仮想関数のパラメータ型は同じでなければなりません
  2. そして、基底クラスの仮想関数のパラメータの数が同じでなければなりません
  3. ベースクラスの仮想関数(クラスタイプがサブポインタによって置換されていてもよい)戻り型と同じである必要があります

C ++関数呼び出しのデフォルト数は動的バインディングを使用していない、ダイナミックな結合条件をトリガするために満たす必要があります。

  • 唯一の仮想関数を動的にバインドすることができますように指定
  • 基本クラスへの関数ポインタや参照によって呼び出されなければなりません

どのような機能は、仮想することはできません

  1. コンストラクタ:コンストラクタは、親クラスのコンストラクタを適切に呼び出すことができない場合
  2. 静的メンバ関数:静的メンバ関数、クラスごとに一つだけのコードは、すべてのオブジェクトがすべてで、特定のターゲットに属していない、このコードを、共有しています。
  3. 友達機能:単純ではないメンバ関数、仮想関数に言及せず
  4. 拘束機能:
  5. 代入演算子オーバーロード機能:基本クラスとサブクラスの異なるパラメータ・タイプ

デフォルトのC ++デストラクタ仮想ではないため、追加の仮想関数テーブルと仮想仮想関数テーブルポインタ、追加のメモリが必要とされています。継承されないクラスの場合は、仮想関数の場合、そのデストラクタは、メモリが無駄になります。したがって、デフォルトのC ++デストラクタ仮想ではないが、それは親クラスの仮想関数セットとして必要な場合にのみ。

仮想関数テーブルポインタ(vptr)および仮想関数テーブル(BPTR)

C ++オブジェクト・モデルのデータメンバー、ここではメンバ関数:

  • すべてのオブジェクトを超えて:静的および非静的メンバ関数、静的データメンバは、グローバル静的記憶領域に配置されています。
  • オブジェクト内:すべての非静的データメンバ

以下のメカニズムの仮想ストレージ機能:

  1. 生成クラス仮想関数ポインタの各束は、表に、このテーブルは、仮想関数テーブル(BPTR)と呼ばれます
  2. 各オブジェクトが仮想関数テーブル(vtableのポインタvptr)を追加するためのポインタです。

遺伝パターンは、仮想関数テーブルオブジェクトが存在し、異なる形態:クラス内容のブログを参照しながら詳細

  1. 単一継承:唯一の派生クラスの仮想関数テーブル。仮想関数テーブルベースクラスの仮想関数テーブルとテーブルは(存在するか否かを派生クラスは、ベースクラスの仮想関数をオーバーライドしない)ではないが、派生クラスは、ベースクラスの仮想関数をオーバーライドしない場合、次いで、塩基および派生クラス仮想機能関数アドレステーブルの点は同じです。
  2. 多重継承:複数の一貫したシーケンス派生クラスの仮想関数テーブルの配置、および継承された仮想関数。派生クラスは、すべてのvtableの内容を上書きしてしまいますと同じ名前の関数をオーバーライドする、派生クラスの仮想関数の新しいカスタムは後にファーストクラスの仮想関数テーブルに展開されます

おすすめ

転載: blog.csdn.net/saber_wtq/article/details/90691766