c++ - 试图从 Derived* 的 vector 中分配 Base* 的 vector

标签 c++ pointers inheritance vector

这似乎是一个非常基本的问题,但我无法弄清楚。我有一个 std::vector 指向派生对象的原始指针,我只想使用赋值运算符将它复制到另一个基指针 vector 。使用 VC++ 我得到错误 C2679 "binary '=': no operator found..."BTW 我不想要对象的深层拷贝,我只想复制指针。示例代码:

#include <vector>
using namespace std;

struct Base{};    
struct Derived: public Base {};

int main (int argc, char* argv[])
{
    vector<Derived*> V1;
    vector<Base*> V2;
    V2 = V1;  //Compiler error here
    return 0;
}

让我感到困惑的是,我可以通过循环并使用 push_back 来复制 vector ,如下所示:

for (Derived* p_derived : V1)
    V2.push_back(p_derived);

所以我的问题是为什么分配失败,而 push_back 有效?对我来说似乎是同样的事情。

最佳答案

那是因为虽然 BaseDerived有关系,没有关系vector<Base*>vector<Derived*> .就类层次结构而言,它们完全不相关,因此您不能将一个分配给另一个。

您正在寻找的概念称为 covariance .例如,在 Java 中,String[]Object[] 的子类型.但是在 C++ 中,这两种类型只是不同的类型,并且没有比 String[] 更相关的类型。和 Bar .

push_back有效,因为该方法只需要 T const& (或 T&& ),所以任何可转换为 Base* 的东西可以接受 - Derived*是。

也就是说,vector有一个带有一对迭代器的构造函数,在这里应该更容易使用:

vector<Base*> v2(v1.begin(), v1.end());

或者,因为它已经构建好了:

v2.assign(v1.begin(), v1.end());

关于c++ - 试图从 Derived* 的 vector 中分配 Base* 的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29494590/

相关文章:

c++ - 正确分配和释放子类 QCPGraph

c - 指向字符串数组的指针数组

python - 通过继承从 Python 类创建 JSON

c++ - 初始化 srand 的推荐方法?

c++ - 如何使用 protobuf 描述符读取枚举

c++ - 是否可以在程序运行时获取程序的输出?

C++:如何将 memcpy 与指针 ** 一起使用?

c - 如何将结构体指针传递给函数?

c - 结构初始化不适用于 malloc

java - GWT 模块和继承