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

C++ 转换为唯一基类指针的向量,c++,vector,casting,unique-ptr,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 printN

编辑

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

#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;
}
#包括
#包括
#包括
使用名称空间std;
类动物
{
公众:
虚拟void printName()=0;
};
犬类:公共动物
{
公众:

virtual void printName(){cout您不能这样做,原因很简单,
重新解释强制转换
静态强制转换
动态强制转换
都不能这样做

当您有以下情况时:

class Superclass {};

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


但是你不能像你在这里试图做的那样,将一个的
std::vector
转换成另一个的
std::vector
。这两个向量类都不是另一个向量类的直接超类或子类。
std::vector
是一个模板。模板的每个实例都是它自己的唯一类,这不是t与模板的任何其他实例相关(除非明确声明,例如使用专门化等)

可能会显示一个输入和输出示例,因为我不理解您的问题。可能我不理解一些东西,但我实际上试图将指向子类指针向量的指针转换为指向基类指针向量的指针。也就是说,我试图将向量视为向量,而不是向量。这仍然是inv吗alid?是的,它仍然无效。不管向量包含什么。您正在强制转换的类是两个不同的向量。std::vector和std::vector是两个相互不相关的独立类。不管X或Y是什么,也不管X是Y的父类还是子类,也不管指向父类还是子类。q中的类这里有两个不同的向量类。句号。粗略的例子:“类A{X*ptr;}”和“类B{Y*ptr;}”。如果X和Y是彼此的父类或子类,则对A和B并不意味着相同。它们是两个独立的类。
class Subclass : public Superclass {};