如果class没有定义destructor,那么只有在class内含的member object(或class自己的base class)有拥有destructor时,编译器才会自动合成一个出来。否则,destructor被视为不需要,也就不需要合成(当然更不需要调用)
1.
1.如果object内含一个vptr,那么首先重设相关的vtbl。
2.destructor的函数体被执行,vptr会在程序员的代码之前被重设。
3.如果class拥有member class objects,而后者拥有destructors,那么它们会以其声明顺序的相反顺序被调用。
4.如果任何直接的(上一层)nonvirtual base classes拥有destructor,它们会以其声明顺序的相反顺序被调用。
5.如果有任何的virtual base classes拥有destructor,目前这个class是最尾端(most-derived)的class,那么它们以其原来的构造的相反顺序被调用。
2.
一个object声明结束期destructor开始执行之时。由于每个base class destructor被轮番调用,所以derived object实际上变成了一个完整的object。例如一个PVertex对象归还内存空间前,会依次变成一个Vertex3d对象、一个Vertex对象,一个Point3d对象,最后变成一个Point对象。当我们在destructor中调用member function时,对象对象的蜕变会因为vptr的重设(在每一个destructor中,在程序员所提供的代码执行之前)而受到影响。