虚析构函数

为什么需要虚析构函数? 可能通过基类指针删除派生类对象,换句话讲,就是避免派生类可能发生的内存泄漏。
我认为,如果你在类中定义了成员指针,那就需要申请获得内存,因此会有析构函数去释放内存。如果不写虚析构函数,用基类定义一个继承的派生类对象,去调用成员函数,编译器就会只调用基类的成员函数,派生类的成员指针就被忽视释放地址。
资料这么说:如果你打算允许其他人通过基类指针调用对象的析构函数(通过delete这样做是正常的),就需要让基类的析构函数成为虚函数,否则执行delete的结果是不确定的。

错误的实例代码

  1. #include <iostream>
  2. using namespace std;
  3. class Base {
  4. public:
  5. ~Base(); //不是虚函数
  6. };
  7. Base::~Base() {
  8. cout<< "Base destructor" << endl;
  9. }
  10. class Derived: public Base{
  11. public:
  12. Derived();
  13. ~Derived(); //不是虚函数
  14. private:
  15. int *p;
  16. };
  17. #include <iostream>
  18. using namespace std;
  19. class Base {
  20. public:
  21. virtual ~Base();
  22. };
  23. Base::~Base() {
  24. cout<< "Base destructor" << endl;
  25. }
  26. class Derived: public Base{
  27. public:
  28. Derived();
  29. virtual ~Derived();
  30. private:
  31. int *p;
  32. };

第5行和13行更正后:

  1. //虚函数
  2. virvual ~Derived();
  3. virvual ~Derived();