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