15.11.2 析构函数中的虚机制

在析构期间,有一些我们可能不希望马上发生的情况。如果正在一个普通的成员函数中,并且调用一个虚函数,则会使用晚捆绑机制来调用这个函数。而对于析构函数,这样不行,不论是虚的还是非虚的。在析构函数中,只有成员函数的“本地”版本被调用;虚机制被忽略。

15.11.2 析构函数中的虚机制 - 图1

15.11.2 析构函数中的虚机制 - 图2

在析构函数的调用中,Derived:f()没有被调用,即使f()是一个虚函数。

为什么是这样呢?假设在析构函数中使用虚机制,那么调用下面这样的虚函数是可能的:这个函数是在继承层次中比当前的析构函数“更靠外的”(更晚派生的)。但是,有一点要注意,析构函数从“外层”(从最晚派生的析构函数向基类析构函数)被调用。所以,实际上被调用的函数就可能操作在已被删除的对象上。因此,编译器决定在编译时只调用这个函数的“本地”版本。注意,对于构造函数也是如此(这在前面已讲到),但在构造函数的情况下,这样做是因为类型信息还不可用,然而在析构函数中,这样做是因为信息(也就是VPTR)虽存在,但不可靠。