虚析构函数与非虚析构函数哪里不一样?
把你的问题整理一下如下:
这个时候我delete 执行父类的指针又会发生什么呢?
C++中明确指出,当派生类对象经由一个基类指针被删除,而此基类仅提供了non-virtual析构函数,其结果是未定义的。如果删除基类指针,则需要运行基类构造函数并清除基类的成员,如果对象实际是指向派生类类型的对象,则没有定义这种行为。
实际执行是通常发生的是对象的derived成分没有被销毁(不同的编译器实现可能不同),而派生类中的base class成分通常会被销毁,这就造成了一个“局部销毁”的对象,从而造成资源泄露。
在Meyers的《Effective C++》《More Effective C++》中都提到过virtual析构函数,消除这个问题很简答:给base class一个virtual析构函数,这会保证运行适当的析构函数。
Now,现在就有这样一个问题,是不是要把所有的class的析构函数都要带上virtual呢,这同样是错误的。要实现virtual函数,对象必须携带某些信息,主要用来在运行时决定哪一个virtual函数应该被调用。这份信息通常是由一个所谓vptr(virtual table pointer)指针指出。vptr指向一个由函数指针构成的数组,成为vtbl(virtual table);每一个带有virtual函数的class都有一个相应的vtbl。当对象调用一个virtual函数,实际被调用的函数取决于该对象的vptr所指的那个vtbl,编译器在其中寻找适当的函数指针。当然在Scott Meyers的另一本书《More Effective C++》中有详细的介绍,同时尝试实现虚函数机制。virtual函数的实现细节并不重要,重要的是如果class中含有virtual函数,其对象的体积会增加,这会带来许多麻烦问题。