在 Google 编程规范 中提到过: 用来做基类的类 其析构函数应该为虚函数.
但是 如果把类 ClxBase 析构函数前的 virtual 去掉 那输出结果就是下面的样子了:
也就是说类 ClxDerived 的析构函数根本没有被调用.
为什么没有被调用 这也很好理解 因为 pTest 是 ClxBase 类型 它的析构不是虚函数的话 也就不能实现多态.
一般情况下类的析构函数里面都是释放内存资源 而析构函数不被调用的话就会造成内存泄漏.
至于子类没有额外数据成员 甚至父类也没有任何数据成员的特殊情况下 析构函数的调用是否必要是语义争论 从编程设计规范的角度看 在含有虚函数的父类中 定义虚析构函数绝对必要.
当然 并不是要把所有类的析构函数都写成虚函数. 因为当类里面有虚函数的时候 编译器会给类添加一个虚函数表 里面来存放虚函数指针 这样就会增加类的存储空间.
所以 只有当一个类被用来作为基类的时候 才把析构函数写成虚函数.