0

我有这个问题:

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

4

1 回答 1

2

发生这种情况是因为slicing

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

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

于 2013-02-25T21:28:46.197 回答