我想要一个派生类指针的向量作为基类指针

Sha*_*Cop 13 c++ inheritance

在C++中,vector类存储一个对象数组.在这种情况下,我存储指向派生类对象(Dogs)的指针.在某些时候,我想将此向量视为指向基类(动物)对象的指针.这是"正确"/无争议的方式吗?为什么我不能这样做?

#include <vector>
using namespace std;

class Animal { }; 
class Dog : public Animal { };

int main(int argc, char *argv[]) {
    vector<Dog*> dogs;
    dogs.push_back(new Dog());
    dogs.push_back(new Dog());
    vector<Animal*> animals = dogs; // This doesn't seem to work.

    // This is really what I want to do...
    vector<Animal*> all_animals[] = {dogs, cats, birds};
}
Run Code Online (Sandbox Code Playgroud)

错误:

Untitled.cpp:11:18: error: no viable conversion from 'vector<class Dog *>' to 'vector<class Animal *>'
    vector<Animal*> animals = dogs;
                    ^         ~~~~
/usr/include/c++/4.2.1/bits/stl_vector.h:231:7: note: candidate constructor not viable: no known conversion from 'vector<Dog *>' to 'const std::vector<Animal *, std::allocator<Animal *> > &' for 1st argument
  vector(const vector& __x)
  ^
Run Code Online (Sandbox Code Playgroud)

Vau*_*ato 12

有一个复制构造函数,std::vector但它要求您复制完全相同类型的向量.幸运的是,还有另一个构造函数,它接受一对迭代器并添加范围内的所有元素,因此您可以这样做:

vector<Animal*> animals(dogs.begin(),dogs.end());
Run Code Online (Sandbox Code Playgroud)

Animal通过迭代每个Dog指针创建一个新的指针向量.每个Dog指针都会转换为Animal指针.

这是一个更完整的例子(使用C++ 11):

#include <vector>

struct Animal { };

struct Dog : Animal { };

struct Cat : Animal { };

struct Bird : Animal { };

int main(int,char**)
{
  Dog dog1, dog2;
  Cat cat1, cat2;
  Bird bird1, bird2;
  std::vector<Dog *> dogs = {&dog1,&dog2};
  std::vector<Cat *> cats = {&cat1,&cat2};
  std::vector<Bird *> birds = {&bird1,&bird2};
  std::vector<std::vector<Animal *>> all_animals = {
    {dogs.begin(),dogs.end()},
    {cats.begin(),cats.end()},
    {birds.begin(),birds.end()}
  };
}
Run Code Online (Sandbox Code Playgroud)

  • @Mahesh因为您永远都不想做`void oops(vector &lt;Animal *&gt;&animals){animals.push_back(new Cat); } vector &lt;Dog *&gt;狗;oops(dogs);`。 (2认同)