私は、次のアプローチが 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()
。低血糖のせい!