假设我有一个抽象类Animal
class Animal {
public:
Animal(const std::string &name) : _name(name)
{
}
virtual void Print() const = 0;
virtual ~Animal() {}
protected:
std::string _name;
};
我有继承这门课的狗和猫。 在我正在阅读的书中,建议在基类中定义虚拟析构函数。 我尝试创建没有virtual des'定义的对象,程序运行正常,没有泄漏(用valgrind检查)。 所以我的问题是为什么使用虚拟析构函数(空实现)?它有什么好处?
谢谢你!答案 0 :(得分:1)
当你有这样的事情时:
class Dog : public Animal {
public:
Dog() {
data = new char[100000];
}
~Dog() {
delete data;
}
private:
char* data;
};
Animal* dog = new Dog;
delete dog;
如果没有虚拟析构函数,编译器将使用Animal类中的析构函数。在Dog类中分配的内存将泄漏。 在基类中定义虚析构函数时,编译器使用Dog类中的析构函数和释放已分配的内存。