假设我有这个示例代码:
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 构造函数
- 一个构造函数
前两个构造函数调用是因为new B()
在重载的 operator new 函数中。但是随后将在函数返回的指针上再次调用 A 构造函数,因为重载的运算符 new 应该返回指向空闲内存的指针(不创建对象),因此再次调用构造函数。
b
如果我在此示例中使用指针,这是未定义的行为吗?