我在问以下方法是否(以及为什么)是a)合法的和b)道德的。我问的重点是 C++03,但也欢迎对 C++11 进行注释。这个想法是为了防止本身可以默认构造的派生类实现愚蠢的B::B(int foo) : A(foo) {}
构造函数。
class Base {
private:
int i;
Base(int i) : i(i) {}
protected:
Base() {}
public:
static Base* create(int i);
};
class Derived : public Base {
};
Base* Base::create(int i) {
Derived* d = new Derived();
Base* b = static_cast<Base*>(d);
delete b;
new(b) Base(i);
return d;
}
我的直觉告诉我,这里有些可疑。如果任何Derived
类访问Base
其构造函数中的成员,我想在其他地方,但否则我很难看到该方法不好的有效原因。
无论如何,如果您认为这是一种可以接受的方法,那么如何处理参考成员(例如int& Base::j
)?
注意:这是如何在 C++03 中伪造构造函数继承的后续问题?.
编辑:发布问题时我一定分心了。当然,不是delete b
我的意思b->~Base()
。我怪低血糖!