3

我有两个类,说' Base'和' Derived',其中Derived类继承Base类。

然后是对派生类实例 ( std::vector< std::reference_wrapper< Derived > > myContainer) 的引用容器。

最后,我有一个std::vector< std::reference_wrapper< Base > >作为参数的函数。

如果我将容器(myContainer)传递给函数,它不会编译:

在此处输入图像描述

如果我改变我的容器来保存对 Base 的引用,一切都会正常工作,因为它是一个 reference_wrapper,我相信,我仍然会有我需要的多态行为。但这感觉不干净,因为我确信我的容器不会容纳除派生实例之外的任何东西。

同时,接受向量的函数应该适用于 Derived 和 Base 类。

最小代码:

#include <vector>
#include <functional>

class Base
{ /*some virtual stuff*/ };

class Derived : public Base
{};

void Fun( std::vector< std::reference_wrapper< Base > > const & container )
{}

int main()
{
    std::vector< std::reference_wrapper< Derived > > myContainer;
    Fun( myContainer ); // Error: no viable conversion
    return 0;
}

实时代码:https ://godbolt.org/z/SX5Gag

要求函数将派生引用的容器视为基本引用的向量的最佳方法是什么?

4

1 回答 1

4

这是不可能的:

std::vector< std::reference_wrapper< Derived > > d;
std::vector< std::reference_wrapper< Base > >& b = d;

如果这是合法的,会发生什么?

SomeOtherDerivedClass o;
b.push_back(o); // sure, b is vector of Base, so legal

但是 b 实际上只是对 d 的引用,所以你只是设法将一个不同的非法类型放入 d 中。

因此,即使Base是 的基类Derived,也不适用于相应的容器,无论是它std::vector还是任何其他容器。

于 2019-10-11T13:25:31.167 回答