関与する複数の継承せずに、単純な階層があるとしますC++でポリモーフィックな追加init()関数を作成するには?
a)は、すべてのderived_x::init()
base::init()
を繰り返す:
class base {
public:
base() { /* */ }
virtual void init() { /* */ }
};
class derived_a : public base {
public:
derived_a() { /* */ }
virtual void init() override { base::init(); /* local stuff to add */ }
};
class derived_b : public base {
public:
derived_b() { /* */ }
virtual void init() override { base::init(); /* local stuff to add */ }
};
そして、クライアントコードは、私は二つの問題を参照してください
auto d_a = new derived_a{};
d_a->init();
のようになります
b)毎回derived_x::init()
を繰り返して、オブジェクトが作成されます
どちらも私の観点からは簡単に忘れられます。
base::base{}
では、base
で、derived_x
ではなく、C++での仮想ディスパッチの仕組みを知っています。しかし、回避策がありますか?ありませんか?開発者が何度も直面してきた共通の問題のように見えます。可能な解決策とは何ですか?
2段階初期化が悪いですが、これを行わないでください。基本クラスに保護されたコンストラクタを追加して、初期化の共通部分を行い、派生したクラスコンストラクタから必要な引数を渡すことができます。 – sbabbi
これはコンストラクタが自動的にあなたのために行うものです。 –
コンストラクタに初期化コードを追加し、 'init()'を削除して2フェーズの初期化を行わないと、コンストラクタは派生クラスコンストラクタの前に常に呼び出されます。派生クラスのインスタンス – Peter