1

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

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

编辑:删除问题的第二部分并添加为评论。

4

1 回答 1

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();
    }
}

还有你的子类

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 中搜索多态性,我刚刚写的答案要详细得多、准确得多。

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

于 2013-06-26T20:38:42.887 回答