仮想関数
仮想関数テーブルの位置の1分析
カテゴリー:仮想関数は、このクラスは仮想関数テーブルを生成します。
オブジェクトクラス: - 仮想関数テーブルポインタポインタ(vptr)クラスの仮想関数テーブルを指します。(クラスの先頭の位置のメモリ空間であってもよいも決定コンパイラによって具現化、末端にあってもよいです)
継承の役割を手動で呼び出し仮想関数2. [
直接することができ、仮想関数呼び出しの機能の割り当てを定義して、仮想関数テーブルポインタのアドレスを取得します。サブクラスの仮想関数は、親クラスの仮想関数をオーバーライドします。
3.分析のvtable
(1)仮想関数が存在する唯一のクラスの仮想関数テーブルを含む、同じクラス共有に仮想関数テーブルに属するオブジェクトが、独自の仮想関数テーブルポインタ(vptr)を有しています。もちろん、同じ仮想関数テーブルにそのクラスのvptrポイントのすべてのオブジェクト。
(2)親クラスが仮想関数を有する同じサブクラスが仮想関数を有しています。親クラスのサブクラスを継承するため(親クラスが仮想関数テーブルを持っていることは、サブクラスは、仮想関数テーブルを持っている必要があります)。
仮想親クラスを削除仮想関数をサブクラス化する場合は、機能はもはや仮想関数ではありませんか?
親クラスでサブクラス機能は仮想書き込まない場合でも、それはまだ仮想あり、仮想関数です。
親クラスまたはサブクラスかどうかは、それぞれのクラスでは唯一、独自の仮想関数テーブルを持っています。より多くの仮想関数テーブルサブクラスがあるでしょうかどうか?
コンテンツ(3)新たな仮想関数サブクラスであれば、同じ仮想関数テーブルの内容にサブクラスvtableの親クラス。しかし、メモリ内の2つの仮想関数テーブルの位置が異なっています。二つの仮想関数テーブル。各仮想関数は、仮想関数テーブルの先頭アドレスを含むが、仮想関数テーブルサブクラスとは、仮想テーブルをスーパークラス場合AN親クラスの仮想関数をカバーしていないサブクラスを示し、同じ機能を(表し)関数は、にエントリポイントと同じです。
(4)未知の仮想関数テーブル部を超えました。
(5)親クラス割当てのような場合、オブジェクトのサブクラスのオブジェクトを、自動的に(カット)を識別し、親オブジェクトにコピーするために、コンパイラの一部である親クラスに属するサブクラス、そうBaseClassの基地=導き出す。実際にやっ二つのこと:まず、ベースオブジェクトが生成されます; IIの部分は、値がベースのオブジェクトに初期化された導き出します。(しかし、今回処理対象のコンパイラ、仮想関数テーブルベースポインタ値、コンパイラが自動的に仮想関数テーブルアドレスBaseClassのためのベースの決定のタイプに応じます)
(4)OO(オブジェクト指向)及びOB(オブジェクトベース)の概念
C ++プログラミングスタイルは、ポインタと参照クラスを通じて多型をサポートすることで、これは私たちはしばしば言うことであるオブジェクト指向します。オブジェクト指向モデル
OBも抽象データモデルADT [抽象データ型モデル]としても知られている(オブジェクトベース)、多状態、高速実行をサポートしていません。決定(なし多型)解析関数呼び出しを実行する必要はありません、このようPBASE =新しい新しい派生*ベース()ので、ベース&BASE2 = derive2が、代わりに、コンパイル時に行われ、メモリ空間が無い架空以来、よりコンパクトなコンパクトな範囲でありますこれらの概念は機能します。
しかし、OB(オブジェクトベース)設計の柔軟性に乏しい、C ++は、両方のオブジェクト指向プログラミングをサポートします。また、オブジェクトベースの設計プログラムをサポートしています。
多重継承のvtableの4分析