为什么在继承中使用虚拟析构函数

时间:2010-09-19 18:00:26

标签: c++

  

可能重复:
  When to use virtual destructors?

假设我有一个抽象类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检查)。 所以我的问题是为什么使用虚拟析构函数(空实现)?它有什么好处?

谢谢你!

1 个答案:

答案 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类中的析构函数和释放已分配的内存。