我有一个名为Animal的类,它有一个虚拟的方法,因此该类成为虚拟类。
class Animal
{
virtual double eat() = 0;
};
我还有另外两个类(class),它们是猫和狗,这些类(class)是从动物那里继承的。
还有第四类-zoo-它有一个 Realm
vector<Animal *> animals;
我将猫和狗实例推到动物园对象的动物 vector 中。
在任何时候我都想清除动物园实例,并且我也想删除该对象的 vector 。我也希望删除此对象的 vector 对象。
我到底该怎么办。
除了zoo之外的所有类都只有float字段(没有指针)。 ( float a,b等)
因此,我们可以说没有必要处理动物对象,因为它们没有任何指针。
我应该在哪里写析构函数。在基类(动物)或子类(猫-狗)中或无处
或者我应该怎么写这些析构函数。
最佳答案
首先,您需要声明一个给Animal
一个虚拟析构函数:
class Animal
{
virtual double eat() = 0;
public:
virtual ~Animal() {}
};
这是必需的,以便在
delete
指针上调用Animal
将调用该指针指向的对象类型的析构函数。在没有虚拟析构函数的情况下执行此操作将导致不确定的行为。接下来,您需要在所有动态分配的
delete
上调用Animals
:for (auto a : animals)
delete a;
然后,您可以清除 vector :
animals.clear();
如果您需要使用
animals
进行其他操作,则这是必需的。您不需要在zoo
析构函数中执行此操作。另外,您可以使用
std::vector<std::unique_ptr<Animal>>
而不用手动进行内存管理。关于c++ - C++中vector <T>中的内存管理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21830533/