c ++将vector <Inherited*>转换为vector <abstract*>

Mat*_*Mat 8 c++ polymorphism casting vector

class Interface{};

class Foo: public Interface{};

class Bar{
public:
    vector<Interface*> getStuff();
private:
    vector<Foo*> stuff;
};
Run Code Online (Sandbox Code Playgroud)

我该如何实现这个功能getStuff()

Gro*_*ozz 25

vector<Interface*> result(stuff.begin(), stuff.end());
return result;
Run Code Online (Sandbox Code Playgroud)


Nik*_*sov 5

std::vector<Inherited*>并且std::vector<abstract*>是不同的,几乎无关的类型.你不能从一个投射到另一个.但您可以std::copy使用或使用迭代器范围构造函数,如@Grozz所说.

编辑:

在评论中回答你的问题:它们是不同的,因为两个兼容类型成员的类是不同的.例:

struct Foo {
    char* ptr0;
};

struct Bar {
    char* ptr1;
};

Foo foo;
Bar bar = foo; // boom - compile error
Run Code Online (Sandbox Code Playgroud)

要使最后一个语句起作用,您需要定义一个显式赋值运算符,如:

Bar& Bar::operator=( const Foo& foo ) {
    ptr1 = foo.ptr0;
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

希望这说清楚.

  • 你能解释一下为什么他们不同吗?在我的观点上,语义上每个"ptr_to_Inherited的向量"也是"ptr_to_abstract的向量" (3认同)