なぜコンストラクタを仮想することはできません(RPM)

出典:http://blog.sina.com.cn/s/blog_620882f401016ri2.html

 

図1に示すように、収納スペースの観点から

    仮想関数は、我々はすべて知っているvtableのに相当するが、このvtableのポインタは、実際にメモリ空間のオブジェクトに格納されています。問題は、コンストラクタが仮想であれば、vtableのことで呼び出す必要がある、しかし、発生したオブジェクトがインスタンス化されていない、そのメモリは決してありません、vtableのを見つけることができないので、コンストラクタが仮想することはできません。

図2に示すように、使用からの角度

       仮想機能は、主に不完全な情報の場合に使用される、オーバーライド機能は、対応する呼び出しを得ることができます。それ自体がインスタンスを初期化するコンストラクタ、実用的な意義ああを持っていない仮想関数を使用します。そのため、コンストラクタは必要ありません仮想関数です。

メンバ関数を呼び出すことが可能となる親クラスへのポインタまたは参照による効果仮想関数はサブクラスに呼び出します。コンストラクタは、オブジェクトを作成するとき、へのポインタまたは参照して、親クラスを呼び出すことは不可能であると自動的に呼び出され、したがって、仮想コンストラクタ関数を所定れることはありません。

視点から構築された4 ,, vbtlは、コンストラクタコール後に達成され、そうコンストラクタは、仮想関数にすることはできません  

 ビューの意味の実用的な観点からは、コンストラクタを呼び出すための本当のタイプは、(コンストラクタサブクラスは親クラスが表示されますので)また、オブジェクトを決定することができませんでした;およびコンストラクタの役割は、初期化を提供することで、オブジェクトの寿命ではなく、オブジェクトに一度だけ行われます動的挙動は、多くの仮想関数があることが必要されていません

5、コンストラクタが呼ばれ、それがない最初のものの一つは、そのvptrを初期化することですしたがって、それは唯一それが「現在」のカテゴリであることを知ることができるがあれば、完全に後に後継者を対象を無視して、。どちらも基本クラスの、また(それが継承され、誰を知っていないため、クラス)には、派生クラスである- -場合は、コンパイラは、クラスのコンストラクタのコードを生成することで、コンストラクタ、のためのコードを生成します。

    それVPTRはクラスV TA BLEのために使用する必要があります。そして、限り、それは最後のコンストラクタ呼び出し、オブジェクトの寿命であるとして、VPTRはV TA BLEを指すように初期化されたままになりますが、そこにある場合、後で派生コンストラクタは、コンストラクタと呼ばれていますセットポイントVPTRなどそのターンV TA BLE、最後のコンストラクタの最後まで。(:これはあるべきであり、「親クラスをオーバーライドサブクラスにおける多型は、要素の仮想関数テーブルに対応する機能が変更され、」注釈)VPTR状態が最後のコンストラクタが呼び出されることによって決定されます。コンストラクタが注文する基本クラスから派生それ以上のクラスであることを別の理由を呼び出すのはこのためです

       コンストラクタのこのシリーズが行われて呼び出したときしかし、各コンストラクタは独自のV TA BLEにVPTRポイントを設定されています。予約疑い、:あなたは仮想関数呼び出しメカニズムを使用する場合は、独自のV TA BLEだけではなく、最後のV TA BLE(すべてのコンストラクタは、最後のV TA BLE後に呼び出されます)(コメントを呼び出して、それが生成しますなどは、後に)理解して見えることがあります。

おすすめ

転載: www.cnblogs.com/Stephen-Qin/p/11512835.html