c++ - 转换为唯一基类指针的 vector

标签 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;
}

输出:Dog Dog Cat

在这里使用 reinterpret cast 安全且合理吗?静态转换不起作用。

PS 我找到了这个主题:I want a vector of derived class pointers as base class pointers但在我的情况下,我正在使用 unique_ptr 并且希望我不想在更新某些子 vector 后立即更新 everyone vector 。我只想获得指向这些子 vector 的指针。

最佳答案

您不能这样做,原因很简单,reinterpret_caststatic_castdynamic_cast 都无法以这种方式工作。

当你有:

class Superclass {};

和一个

class Subclass : public Superclass {};

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

但是您不能将一个的 std::vector 转换为另一个的 std::vector ,就像您在这里尝试做的那样。这两个 vector 类都不是直接父类(super class),也不是另一个 vector 类的子类。 std::vector 是一个模板。模板的每个实例都是它自己的唯一类,与模板的任何其他实例无关(除非明确声明,使用专门化等...)

关于c++ - 转换为唯一基类指针的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36084446/

相关文章:

c++ - 如何对包含 pair<int,int> 元素的 vector 进行排序?根据比较功能进行排序

c++ - 从基类到不同派生类的多重继承转换

c++ - 在遗留代码上规避 RTTI

c++ - 重载后无法调用 std::minus - 运算符

c++ - 将 std::array 转换为 std::vector

c++ - 使用单调堆栈背后的直觉

c++ - 如何在一个 vector 中存储具有不同数据类型的对象

java - 安全和不安全的沮丧示例?

c++ - 我应该采取什么步骤来用普通变量替换指针的出现?

c++ - hash_map 在 C++ STL 中崩溃