第5章 构造、析构、拷贝语义学4:析构函数语义学

析构函数也是根据编译器的需要才会合成出来,两种情况:

  1.  class中有某个object拥有析构函数;
  2. 继承自某个base class,该base class含有析构函数。

定义了 constructor 后不一定要定义 destructor,决定 class 是否需要 destructor 是程序层面的事。

与构造函数相比,即使拥有虚函数或者虚拟继承,不满足上述两个条件,编译器是不会合成析构函数的。在继承体系中,由我们定义的 destructor 的扩展方式和 constructor 类似,只是顺序相反,顺序如下:

  1. destructor的函数本体首先被执行

  2. 如果class拥有member class object,且该class含有destructor,那么它们会以声明顺序相反的顺序依次被调用。

  3. 如果 object 内含一个 vptr,现在被重新被设定,指向适当的base class的virtual table

  4. 如果有任何直接的(上一层)nonvirtual base classes 拥有 destructor,那么它们会以声明顺序相反的顺序依次被调用。

  5. 如果有任何 virtual base classes 拥有 destructor,而目前讨论这个class是最尾端(most-derived)的class,那么它们会以原来构造顺序相反的顺序依次被调用。

一个object的声明结束于 destructor 开始执行时,由于每个base class destructor都被调用,所以derived object实际上变成了一个完成的object。例如一个pvertex对象归还其内存空间之前,会依次变成一个vertex3d,vertex,point3d,最后成为一个point对象。当在destructor中调用member function时,对象的蜕变会因为vptr的重新设定(在每一个destructor中,程序员所提供的代码前)而受到影响。

你可能感兴趣的:(深入探索C++对象模型,c++)