我看到很多人使用new
来创建派生类的实例,然后他们在某个容器中保留指向base的指针。对于为每个派生类使用容器,这有什么优势吗?
有了这个,我的意思是以下
class A
{
public:
vector<Base*> bases;
set<Derived1> der1;
set<Derived2> der2;
//other stuff
};
修改:删除了问题的第二部分,并添加为评论。
答案 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中搜索多态性,我刚才写的那个答案要详细得多。
对不起,我不是母语为英语的人。