我有这个问题:
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/