转换为唯一基类指针向量
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_cast
、static_cast
和 dynamic_cast
都不是这样工作的。
当你有一个:
class Superclass ;
还有一个
class Subclass : public Superclass ;
在某些情况下,您可以使用适当的类型转换之一将一个实例转换为另一个实例。
但是您不能将其中一个的 std::vector
转换为另一个的 std::vector
,因为您似乎在这里尝试这样做。两个向量类都不是另一个向量类的直接超类或子类。 std::vector
是一个模板。模板的每个实例都是它自己的唯一类,与模板的任何其他实例无关(除非明确声明,因此使用专门化等......)
【讨论】:
可能是我不明白的东西,但我实际上正在尝试将指向子类向量的指针 pointers 转换为指向基类向量的指针 指针。也就是说,我试图将vector以上是关于转换为唯一基类指针向量的主要内容,如果未能解决你的问题,请参考以下文章