初始化虚拟继承层次结构

时间:2012-09-06 23:52:10

标签: c++ inheritance c++11 virtual-inheritance

考虑以下虚拟继承层次结构

#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继承derivedbase的初始化被忽略。

如何在保持虚拟继承的同时获得所需的输出,而不必显式调用每个基类构造函数?

修改
我意识到我要求的是因为虚拟继承而无法使用继承层次结构中的构造函数调用。我希望有人可以提供一种替代方法,在构造most_derived时产生所需的结果。

1 个答案:

答案 0 :(得分:3)

你要求两个相互矛盾的目标。一方面你想维护虚拟继承(你真的需要它吗?)另一方面你希望不要直接从最派生类型调用构造函数。

你不能两者兼得,所以选择一个。你当然可以从最派生的类型中传递所需的字符串,但我猜这点不是实际值,而是从底部向上构造值的事实... < / p>