我有一个名为Animal的类,它有一个虚拟方法,因此该类成为虚拟类。
class Animal
{
virtual double eat() = 0;
};
我还有两个类,它们是猫和狗,这些类继承自动物。
并且有第四类-zoo-并且它有一个字段
vector<Animal *> animals;
我正在将猫狗实例推向动物园对象的动物矢量。
我想在任何时候清除动物园实例,我也希望删除此对象的向量。我也希望删除这些对象的矢量对象。
我应该怎么做。 除了动物园之外的所有类都只有浮点字段(没有指针)。 (浮动a,b等) 所以我们可以说没有必要处理动物物品,因为它们没有任何指针。我应该在哪里写析构函数。在基类(动物)或子类(猫 - 狗)或无处 或者我该如何编写这些析构函数。
答案 0 :(得分:8)
首先,您需要声明一个给予Animal
虚拟析构函数:
class Animal
{
virtual double eat() = 0;
public:
virtual ~Animal() {}
};
这是必需的,以便在delete
指针上调用Animal
将调用指针指向的对象类型的析构函数。在没有虚拟析构函数的情况下执行此操作会导致未定义的行为。
接下来,您需要在所有动态分配的delete
:
Animals
for (auto a : animals)
delete a;
然后,您可以清除矢量:
animals.clear();
如果您需要将animals
用于其他内容,则必须执行此操作。您不需要在zoo
析构函数中执行此操作。
或者,您可以使用std::vector<std::unique_ptr<Animal>>
而忘记手动内存管理。