このサンプルコードがあるとします:
class A
{
public:
static void* operator new(size_t sz);
private:
int xA;
float yA;
};
class B : public A
{
private:
int xB;
float yB;
};
void* A::operator new(size_t sz)
{
void* ptr = (void*)new B();
return ptr;
}
int main()
{
B* b = (B*) new A();
// Use b ..
delete b;
return 0;
}
ここでは、コンストラクターがその順序で呼び出されます (VS2012 でテスト済み)。
- コンストラクター
- B コンストラクター
- コンストラクター
最初の 2 つのコンストラクター呼び出しはnew B()
、オーバーロードされた演算子 new 関数によるものです。ただし、オーバーロードされた演算子 new は (オブジェクトを作成せずに) 空きメモリへのポインターを返すことになっているため、関数によって返されたポインターで A コンストラクターが再度呼び出され、コンストラクターが再度呼び出されます。
この例でポインターb
を使用した場合、これは未定義の動作ですか?