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

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

你不能两者都得到,所以选择一个。您当然可以从最派生的类型中传递所需的字符串,但我猜测该点不是实际值,而是该值是自下而上构造的事实......

于 2012-09-07T00:03:23.517 回答