c ++将vector <inherited *>转换为vector <abstract *> </abstract *> </inherited *>

时间:2010-10-08 14:24:44

标签: c++ vector casting polymorphism

class Interface{};

class Foo: public Interface{};

class Bar{
public:
    vector<Interface*> getStuff();
private:
    vector<Foo*> stuff;
};

如何实现功能getStuff()

3 个答案:

答案 0 :(得分:25)

vector<Interface*> result(stuff.begin(), stuff.end());
return result;

答案 1 :(得分:5)

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

编辑:

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

std::copy

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

struct Foo {
    char* ptr0;
};

struct Bar {
    char* ptr1;
};

Foo foo;
Bar bar = foo; // boom - compile error

希望这说清楚。

答案 2 :(得分:1)

我正在使用它。这不是很好,但我认为很快:)。

vector<Interface*> getStuff()
{
    return *(std::vector<Interface*> *)&stuff;
}

您还可以使用此方法仅返回对向量的引用

vector<Interface*> &getStuff()
{
    return *(std::vector<Interface*> *)&stuff;
}