转换为唯一基类指针向量

Posted

技术标签:

【中文标题】转换为唯一基类指针向量【英文标题】:Conversion to a vector of unique base class pointers 【发布时间】:2016-03-18 12:29:13 【问题描述】:

编辑

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

#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;

输出:狗狗猫

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

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

【问题讨论】:

也许显示一个示例输入和输出,因为我不明白你写的问题。 【参考方案1】:

您不能这样做,原因很简单,reinterpret_caststatic_castdynamic_cast 都不是这样工作的。

当你有一个:

class Superclass ;

还有一个

class Subclass : public Superclass ;

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

但是您不能将其中一个的 std::vector 转换为另一个的 std::vector,因为您似乎在这里尝试这样做。两个向量类都不是另一个向量类的直接超类或子类。 std::vector 是一个模板。模板的每个实例都是它自己的唯一类,与模板的任何其他实例无关(除非明确声明,因此使用专门化等......)

【讨论】:

可能是我不明白的东西,但我实际上正在尝试将指向子类向量的指针 pointers 转换为指向基类向量的指针 指针。也就是说,我试图将vector> 视为vector>。不是矢量 作为矢量。这仍然无效吗? 是的,仍然无效。向量包含什么无关紧要。您要转换的类是两个不同的向量。 std::vector 和 std::vector 是两个相互不相关的独立类。 X 或 Y 是什么,或者 X 是 Y 的父类还是子类,或者指向父类或子类的指针都无关紧要。这里讨论的类是两个不同的向量类。句号。粗略的例子:“class A X *ptr; ”和“class B Y *ptr; ”。如果 X 和 Y 是彼此的父或子,则对 A 和 B 的含义不同。它们是两个独立的类。

以上是关于转换为唯一基类指针向量的主要内容,如果未能解决你的问题,请参考以下文章

无法将参数 1 从派生指针转换为基类指针引用

从基指针集合转换为子类

将指向部分构造对象的指针转换为指向基类的指针是不是合法?

将基类指针强制转换为子类指针后的疑惑

将指针从派生类转换为基类的最佳方法

C++:: 指针 - 从基类转换为派生类