Car*_*ton 13 c++ inheritance pointers vector
这似乎是一个非常基本的问题,但我无法弄清楚.我有一个std::vectorDerived对象的原始指针,我只想使用赋值运算符将它复制到另一个Base指针向量.使用VC++我得到错误C2679"binary'=':没有找到操作符......"顺便说一下,我不想要对象的深层副本,我只是想复制指针.示例代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
让我感到困惑的是,我可以通过循环遍历它来复制矢量并使用push_back,如下所示:
for (Derived* p_derived : V1)
V2.push_back(p_derived);
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,为什么作业失败,而push_back有效?对我来说似乎是一样的东西.
Bar*_*rry 21
那是因为虽然Base并且Derived有关系,但是vector<Base*>和之间没有任何关系vector<Derived*>.就类层次结构而言,它们完全不相关,因此您不能将它们分配给另一个.
您正在寻找的概念称为协方差.例如,在Java中,String[]是一个子类型Object[].但在C++中,这两种类型都只是不同的类型和不超过相关String[]和Bar.
push_back因为该方法只需要一个T const&(或T&&),因此任何可转换为a的东西Base*都是可以接受的 - 这是一个Derived*.
也就是说,vector有一个带有一对迭代器的构造函数,在这里应该更容易使用:
vector<Base*> v2(v1.begin(), v1.end());
Run Code Online (Sandbox Code Playgroud)
或者,因为它已经构建:
v2.assign(v1.begin(), v1.end());
Run Code Online (Sandbox Code Playgroud)
push_back执行元素转换.赋值运算符仅存在于相同类型的向量之间.
一个简单的解决方案是使用assign:
v2.assign(v1.begin(), v1.end());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1186 次 |
| 最近记录: |