我在問是否(以及爲什麼)以下方法是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
)?
注意:這是對How can I fake constructor inheritance in C++03?的後續問題。
編輯:我必須張貼的問題時已經分心。當然,而不是delete b
我的意思是b->~Base()
。我怪怪低血糖!
如果有,我會打電話給'〜派生',當我說'刪除b'時,我不會。我不是這個意思。 – bitmask
@bitmask:無論你想要什麼都不重要......除非基類具有虛擬析構函數,否則語言不允許你調用指向基類的指針。 –
@bitmask:討論所有這些方法的方法有太多錯誤,但是您必須考慮內存分配/釋放,每個時間點對象的運行時類型...... –