派生クラス オブジェクトが作成されたときに最初に領域が割り当てられるのはどれですか?
基本クラスのコンストラクターか派生クラスのコンストラクターか?
初め、
割り当て、あなたが求めているメモリの予約は、初期化(本質的にそのメモリに適切な値を設定するコンストラクターの実行)とは異なり、それに先行します。
形式的 (私たちの神聖な基準) と実際には、最も派生したオブジェクトのメモリが連続している必要があるかどうかが異なります。形式的では、主に複数の仮想継承をサポートするために、「メモリの領域」を非連続である可能性があると定義しています。 .
つまり、実際には、最も派生したオブジェクトは、すべての基本クラス サブオブジェクトとデータ メンバー サブオブジェクト用のスペースを含む単一の連続したメモリ チャンクであり、このチャンクは必ず一度に割り当てられます。
初期化 (コンストラクターの呼び出し) は、割り当て後に続行されます。new
例外をスローして初期化が失敗した場合、式は割り当て解除を保証します。ただし、採用されている割り当て関数に追加のカスタム引数 (いわゆる「placement new」) があり、対応する割り当て解除関数が利用できない場合、たとえば Microsoft の MFC クラス フレームワークの初期バージョンのデバッグ ビルドの場合のように、この保証は無効になります。 (かなり皮肉なことでした: 初期化に失敗したプログラムは、デバッグ ビルドでのみメモリ リークを起こします…)。
派生オブジェクトのスペースには、すべての派生メンバーとすべての基本メンバーが格納されます。派生オブジェクトの割り当ては 1 つだけで、割り当てられたメモリはオブジェクトのすべての部分を保持します。
コメントで述べたように、これは Base クラスです。論理的には、Derived クラス (コンストラクターを含む) の基本的な public および protected メンバーにアクセスできるため、最初に割り当てる必要があります。次のコードから始めて、いろいろ試してみてください。
#include <iostream>
class Base
{
public:
Base() {std::cout<<"Base CTOR" << std::endl;}
};
class Derived : public Base
{
public:
Derived():Base() {std::cout<<"Derived CTOR"<<std::endl;}
};
int main(int argc, char* argv[])
{
Derived d;
}