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

时间:2013-06-26 20:17:42

标签: c++ inheritance containers heterogeneous

我看到很多人使用new来创建派生类的实例,然后他们在某个容器中保留指向base的指针。对于为每个派生类使用容器,这有什么优势吗? 有了这个,我的意思是以下

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

修改:删除了问题的第二部分,并添加为评论。

1 个答案:

答案 0 :(得分:0)

如果您执行以下操作

vector<base*> bases;

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

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

然后你有两个派生类:Car和Submarine

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

你的Sub类

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

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

我会尽力解释那句话。 现在您已经拥有了Vehicule,Car和Submarine类,您将创建一个Vehicule指针的数组(或类似矢量的stl容器)。

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

第一次调用move将调用Car方法中定义的move方法。第二个将调用Submarine中定义的移动。因为您可能有一个Vehicule *的向量,但是当您调用该函数并且因为它是虚拟的时,您正在调用它的相应版本。通过只调用一个函数,您可以使用不同的行为。 你可以添加尽可能多的派生类Vehicule,你只需要调整move方法。

你应该在stackoverflow中搜索多态性,我刚才写的那个答案要详细得多。

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