用std::initializer_list中的实例重写



我有这个问题:

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的实例中。解决这个问题的变通方法(除了从堆中分配(是什么?我想可变模板构造函数可能就是其中之一。

这是因为切片

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

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

最新更新