1

次の仮想継承階層を検討してください

#include <string>
#include <iostream>

struct base
{
  base() = default;
  base( std::string const& s ) : s_(s) {}

  std::string print() { return s_; }

private:
  std::string s_;
};

struct derived : virtual base
{
  derived( std::string const& s ) : base( "cool formatting: " + s ) {}
};

struct more_derived : virtual derived
{
  more_derived( std::string const& s ) : derived( "even cooler formatting: " + s ) {}
};

int main()
{
  std::cout << more_derived( "foo" ).print() << std::endl;
}

望ましい出力:

cool formatting: even cooler formatting: foo

more_derived文字列を受け取るコンストラクターを明示的に呼び出していないため、コードは何も出力しません。baseしたがって、既定のbaseコンストラクターが呼び出されます。また、virtual継承によりderivedの初期化baseは無視されます。

仮想継承を維持しながら、各基本クラスのコンストラクターを明示的に呼び出す必要なく、目的の出力を取得するにはどうすればよいですか?

編集:
仮想継承のために、コンストラクターを使用して継承階層を呼び出すことはできないことを認識しています。の構築時に望ましい結果が得られる別の方法を誰かが提供してくれることを期待していましたmost_derived

4

1 に答える 1

3

あなたは2つの相反する目標を求めています。一方では仮想継承を維持し(本当に必要ですか?)、もう一方ではコンストラクターが最も派生した型から直接呼び出されないようにします。

両方を入手することはできないので、どちらかを選択してください。もちろん、最も派生した型から目的の文字列を渡すこともできますが、ポイントは実際の値ではなく、値が下から上に構築されているという事実だと思います...

于 2012-09-07T00:03:23.517 に答える