C ++オブジェクト・モデルの再読み込み深さ探査:機能

メンバ関数を呼び出します:

1.非静的メンバ関数:

静的関数は、実際には、以下のプロセスを経て呼び出します。

1.関数プロトタイプ、追加のパラメータとして、ポインタのこの配置を書き換えます

Point3dと:: magnitude3d()constは{}フロート。
フロートmagituded3d(CONST Point3dと* _this){}。

2の関数の非静的メンバー(静的メンバは、このポインタに拘束されることはない、それはカテゴリに属し、具体例に属していない)、このポインタを介してアクセスするためにアクセス

3.メンバ関数は、プログラムの中で、このユニークな機能を行うために書き換えられ関数名を新しい外部関数を再書き込みします

4.NRV最適化:パラメータとして戻り値、パラメータリストに配置基準としては、戻り値を直接返します。

Xバー()--------->ボイドバー(これ、X&_result)

2.仮想メンバ関数

正規化は、()仮想メンバ関数である場合、ptr->(正規化);それに変換されます。

(* ptr-> vptr [1])(PTR)

 PTR vptr仮想関数ポインタを介して、このコールへのポインタを渡す、機能位置にジャンプ、その後に対応する機能を検索するための、対応する仮想関数テーブルを検索します。

 非多型、関数obj.normalizeを呼び出しなど()コールはvptrを通過しない場合には、これは従来の非静的関数効率と一致しています。

3.静的メンバ関数

静的メンバ関数は、直接、非静的メンバは非静的メンバ関数を呼び出すことはできませんアクセスすることはできません。あなたは非静的メンバ関数を呼び出している場合は、インスタンスを通じて非静的メンバ関数を呼び出すために、非静的メンバ関数のインスタンスを引数に属して渡す必要があります。これは、非静的メンバ関数は、この相と結合していないので、端部がどのオブジェクトが属する非スタティックメンバ関数の呼び出しを指定する必要があります。

特長静的メンバ関数こと:

1.直接非静的メンバおよび非静的メンバ関数の呼び出しにアクセスすることはできません。

2.までにconst、揮発性または仮想として宣言することはできません。(それはこのポインタに拘束されていないため) 

 

仮想メンバ関数:

ptr-> Z()のために

どのような情報は、実行時に右のコールZ()エンティティを作成するために必要とされます。

これは、実数型1.ptrを指摘しました

2.z()位置

コンパイル時には、機能の仮想アドレスが確定すると、これらの関数のアドレスは、動作期間は変更されません。

また、仮想関数テーブルを指すように使用されるvptrポインタに新しいクラスに入れ、仮想関数は、仮想関数テーブルにより呼び出されます。

単一継承の下で:P157

この数字も、あまりにも気ペースト

 

多重継承は次のとおりです。

誰が、なぜなら必要の...主に第二および第三又は第四の基底クラスで、複雑になる連続した複数の仮想メンバ関数この実施期間でポインタを調整します

セット:

クラスA {}。

クラスB {}。

クラスC:パブリックA、公衆B {}。

ベースポインタを使用する場合:

*のA =新しいC;

この時点で、単一継承、開始アドレスの点Cとの間の違いはありません。

第2のベースクラスの中:

Bの* B =新しいC。

Bアドレスに調整する必要があり、この場合には、Bのサブオブジェクトではなく、オブジェクトの開始の先頭アドレスを指します。

この調整せず、BのB(Cない)を介して呼ばれるクラスのメンバーは、エラーが発生します。B-> DATA_B。

これは実際のクラスにオフセットアドレス+を開始することによってAとBとの間の関係が同じレベルであるので、Cは、B、C ++から直接継承することと等価であるからであり、およびメンバーへのアクセスアドレス考慮することなく、達成され、部材のBはBに対してオフセットされているが、現在の調整点Bせず、B-> DATA_Bオフセットは、+ Bの開始アドレスとなり、アクセスは、どのようなデータメンバを知りません。

一方、Bは、デストラクタが呼び出された場合:Bを削除します。

このとき、だけでなく、Cの先頭にbにポインタを調整します

我々は、すなわち、高度なCのデストラクタ、削除Bを削除し、同じ効果を得るようにしたいので、これは、BはAのデストラクタを実行し、実行されています。

調整なしで、分析Cは、Bが終了した後に表示され、完成した構造は、(その権利???です

開始アドレスCに調節し、関係なく基本クラスポインタの保証され、同じ順序のデストラクタで行われます。

aとbのために、彼らは同じ結果デストラクタを達成した場合でも、しかし実際にはこのように:

ランで発生調整最初のポインタのB破壊、。

これは派生クラス目以降の呼び出しに仮想関数ポインタをポイントすることにより、すなわち、最初のケースです。

第2の状況は以下のとおりです。

仮想関数は、派生クラスを指すポインタを介して第2及び後続の呼び出しから基本クラスを継承しました。

C *とC =新しいC;

C-> funcBの。

cは開始アドレスを開始点Cであるため、これは点CはBのサブオブジェクトに調整されていない場合、各ベースクラスvptrのオフセットが、固定され、その後、実際にvptrから継承されたコールします仮想関数テーブルは、スロット機能の同じ位置を指し、そして悪魔はこれが何であるかを知っています。

この時点でのように、B点オブジェクトに調整します。

第三のケースです。

Bの* B1 =新しいC;

B * B2 = B1-> FUNC();

FUNCを説明します。

Bは、B *、CでC *はを返しを返すに関数func、仮想関数Bの両方で、Cは、仮想関数を書き換えており、機能は、AでA *を返します。

B1-> FUNC初見、この時点でB1は開始アドレス℃に調整され、その後CバージョンFUNCが呼び出され、位置調整がポインタを返す必要がある前に得られたC *、本B2のC *へのポインタを返します場所へのBのsubobejtct、一般的に、もしBのB2 =新しいC。

そうしないとB2は多くの問題が発生したコールにつながったC年代の初め、を指すようになります。

あなたは少しファジーTMをマップブックにおけるP165チャート

 

 もう一つのポイント:

Bの* B =新しいC。

ベース部材Bクラスからのみアクセス可能B、派生クラスは、クラスAの新しいメンバーにアクセスすることはできませんさえあります。そのため、静的バインディングB BのBのよく知られたクラスであるので、彼は唯一のクラスBのメンバーにアクセスすることができます

しかし、我々はA、Bので、Cのメンバーが呼び出すことができ、カテゴリCに彼を変換するための変換モードをdynmic_castまたは他のことができます。

おすすめ

転載: www.cnblogs.com/lxy-xf/p/11390210.html