将派生类的实例存储在C++中

storing the instances of the derived class in C++

本文关键字:C++ 存储 实例 派生      更新时间:2023-10-16

我看到很多人使用new来创建派生类的实例,然后在某个容器中保留一个指向基类的指针。对于每个派生类使用一个容器,这有什么好处吗?我的意思是下面的

class A
  {
 public:
  vector<Base*> bases;
  set<Derived1> der1;
  set<Derived2> der2;
  //other stuff
  };

编辑:删除了问题的第二部分,并添加为注释

如果执行以下

vector<base*> bases;

然后可以在对象上使用多态性。想象一下,你有一个名为Vehicule的基类。它有一个从a点到B点的move()方法。

class Vehicule
{
  public:
    virtual void move(){}
}

然后你有两个派生类:汽车和潜艇

class Car : public Vehicule
{
  public:
    void move()
    {
       checktires(); 
       drive();
    }
}

和你的子类

class Submarine : public Vehicule
{
  public:
    void move()
    {
       submersion(); 
       propulsion();
    }
}

因为move方法是一个虚拟方法,所以您将执行多态性。这是一种机制,允许您调用相同的函数,但根据对象的动态类型具有不同的行为。

我会尽力解释那句话。现在您有了Vehicule、Car和Submarine类,您将创建一个Vehicle指针数组(或像向量一样的stl容器)。

std::vector<Vehicule*> objects; 
objects.push_back(new Car());
objects.push_back(new Submarine());
objects[0]->move();
objects[1]->move();

第一个move调用将调用Car方法中定义的move方法。第二个将调用潜艇中定义的动作。因为你可能有一个向量Vehicule*,但当你调用函数时,因为它是虚拟的,你调用的是它的适当版本。只调用一个函数,你就会有不同的行为。你可以添加尽可能多的Vehicule派生类,你只需要调整move方法。

你应该在stackoverflow中搜索多态性,有比我刚才写的更详细、更准确的答案。

对不起,我不是以英语为母语的人