次の仮想継承階層を検討してください
#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
。