关于C++:为什么在继承中使用虚析构函数


why use virtual destructor in inheritance

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
When to use virtual destructors?

假设我有一个抽象类动物

1
2
3
4
5
6
7
8
9
10
class Animal {
public:
    Animal(const std::string &name) : _name(name)
    {
    }
    virtual void Print() const = 0;
    virtual ~Animal() {}
protected:
    std::string _name;
};

我有狗和猫继承了这个阶级。在我正在读的一本书中,建议在基类中定义一个虚拟析构函数。我试图创建没有虚拟des定义的对象,程序运行良好,没有泄漏(用valgrind检查)。所以我的问题是为什么使用虚拟析构函数(使用空实现)?它的好处是什么?

谢谢您!


当你有这样的东西时:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Dog : public Animal {
public:
   Dog() {
      data = new char[100000];
   }
   ~Dog() {
       delete data;
   }
private:
   char* data;
};

Animal* dog = new Dog;
delete dog;

没有虚拟析构函数,编译器使用动物类的析构函数。在dog类中分配的内存将泄漏。在基类中定义虚拟析构函数时,编译器使用dog类中的析构函数并释放分配的内存。