c++ - 用 std::initializer_list 中的实例覆盖

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

最佳答案

发生这种情况是因为切片

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

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

关于c++ - 用 std::initializer_list 中的实例覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15076721/

相关文章:

c++ - 自定义 C++ 迭代器问题

c++ - 来自 Qt 的 Bizzare 错误

c++ - 在 C++ 和 opencv 中将欧几里德转换​​为齐次空间

c++ - 使用 constexpr 的替代元组迭代

C++如何使它成为构造函数中的 volatile 指针

c++ - 为什么 C++ 不能在不让我们编写标记的情况下自动确定何时使用 constexpr?

c++ - Visual Studio 链接器无法写入 [十六进制数]

c++ - 提供基类(或不可复制)和虚拟继承的类型

c++ - 数组的 constexpr 初始化以对内容进行排序

c++ - 保护回调函数免受解构类影响的最佳方法