之前面试的时候经常会问到关于C++中析构函数为什么会是虚函数的问题,虽然这个问题在面试中已经问烂了,但是这个问题在网上也并没有一个特别好的全面的解答,最近翻看effective c++,条款07解释的非常好,筛选出一部分分享给大家。
当派生类对象经由一个基类指针被删除,而该基类的析构函数非虚,其结果未有定义:实际执行时通常发生的是对象的派生成分没被销毁,而派生类的析构函数未能执行起来,积累成分会被销毁,会导致内存泄漏,资源泄漏,败坏的数据结构等情况,给基类一个虚析构函数,可以防止析构的时候只析构基类而不析构派生类的状况发生,用基类的指针去操作继承类的成员,释放指针的过程中释放了继承类的资源,再调用基类的析构函数。
如果一个类中不含有虚函数,令其析构函数是虚函数并不好,因为这样会增加内存开销。要实现出虚函数,对象必须携带某些信息,主要用来在运行期决定哪一个虚函数被调用。这份信息通常由vptr指针指出,每个对象都有一个vptr指针,指向一个由函数指针构成的数组,称为vtbl(虚表),每一个带有虚函数的类都有一个相应的虚表,当对象调用某一虚函数时,实际被调用的函数取决于该对象的虚指针所指的虚表:编译器在其中寻找适当的函数指针。
如果无端定义虚函数,会导致增加指针数目进而增加内存开销,可能会影响传递至其他语言所写函数的可移植性,所以如果一个类不是作为基类使用,或不是为了具备多态性,就不该声明为虚析构函数。