转换为唯一基类指针的向量

时间:2016-03-18 12:29:13

标签: c++ vector casting unique-ptr

修改

根据要求,我提供了一个例子:

#include <iostream>
#include <vector>
#include <memory>

using namespace std;

class Animal
{
    public:
        virtual void printName() = 0;
};

class Dog: public Animal
{
    public:
        virtual void printName() { cout << "Dog" << endl; }
};

class Cat: public Animal
{
    public:
        virtual void printName() { cout << "Cat" << endl; }
};

int main()
{
    vector<vector<unique_ptr<Animal>> *> groups_of_animals;

    vector<unique_ptr<Dog>> dogs;
    vector<unique_ptr<Cat>> cats;

    dogs.push_back(unique_ptr<Dog>(new Dog));
    dogs.push_back(unique_ptr<Dog>(new Dog));
    cats.push_back(unique_ptr<Cat>(new Cat));

    groups_of_animals.push_back(reinterpret_cast<vector<unique_ptr<Animal>> *>(&dogs));
    groups_of_animals.push_back(reinterpret_cast<vector<unique_ptr<Animal>> *>(&cats));

    for(auto &group: groups_of_animals)
        for(auto &animal: *group)
            (animal) -> printName();

    return 0;
}

输出:狗狗猫

在这里使用重新解释演员是否安全且合理?静态演员不起作用。

PS我找到了这个主题:I want a vector of derived class pointers as base class pointers但在我的情况下我使用的是unique_ptr,并希望我不想在更新一些子向量时立即更新 everyone 向量。我只想指出那些子载体。

1 个答案:

答案 0 :(得分:3)

您不能这样做是因为reinterpret_caststatic_castdynamic_cast都不是这样的。

当你有:

class Superclass {};

class Subclass : public Superclass {};

在某些情况下,您可以使用其中一个适当的强制转换来将一个实例转换为另一个。

但你无法将std::vector一个投射到另一个的std::vector,因为你似乎正试图在这里做。两个向量类都不是直接超类或另一个向量类的子类。 std::vector是一个模板。模板的每个实例都是它自己的唯一类,它与模板的任何其他实例无关(除非明确声明,因此,使用特化等...)