覆盖std :: initializer_list中的实例

时间:2013-02-25 21:22:23

标签: c++ c++11

我有这个问题:

struct A
{
  ... some const virtual members ...
};

struct B: A
{
  ... some const overrides ...
};

struct C
{
  C(std::initializer_list<A> const& list) // initialized with instances of B
  {
    for (auto const& a: list)
    {
      a.virtual_member_call(); // but struct B overloads do not get called
    }
  }
};

这种情况发生了,因为B的实例被复制到A的实例中。解决此问题的解决方法是什么(除了从堆中分配)?我想一个可变参数模板构造函数可能就是其中之一。

1 个答案:

答案 0 :(得分:2)

因为切片而发生这种情况。

std::initializer_list<>不是多态容器,它是类型为A的值的简单容器。构造列表时,会复制对象。从类型A的对象复制构造类型为B的对象时,会发生切片。最终会得到一个A类型的对象,它是您复制的B类型原始对象的“A投影”。

如果您想拥有异构多态类型的初始化列表,请考虑使用(智能)指针。