【发布时间】:2012-11-22 07:51:42
【问题描述】:
我看到了一些这样的代码:
class BaseClass
{
public:
BaseClass(int param);
};
class Derived: public BaseClass
{
};
BaseClass::BaseClass(int param)
{
new (this) Derived;
}
代码试图做什么?我认为它会创建一个派生类对象。然而,背后的逻辑是什么?我想当我们调用 new BaseClass() 时,它只会根据基类大小分配内存。但是,为什么我们仍然可以将这个指针传递给新的位置来构造 Derived 类对象?
编辑: 谢谢回复。进一步检查,代码确实覆盖了基类的 operator new 以分配足够的内存来保存派生类对象并避免递归调用它,在派生类构造函数中,它调用了另一个基类构造函数。
基本上我认为它正在尝试创建类似于工厂的东西,其中创建对象的位置取决于参数。根据回复,这样做似乎不是一个好习惯。
【问题讨论】:
-
呃!哇——哇!这不是好的代码。
-
那条路是疯狂的,除非当然有might be a Curiously Recurring Template Pattern参与(你没有显示)——即使那样它也很臭
-
...除了由于无限递归而产生 StackOverflow 之外,您的意思是?
-
@David:它甚至无法编译(
Derived没有有效的构造函数)。
标签: c++