我们说我们的代码如下:
class Base{
public:
virtual ~Base(){PutStat();};
virtual void PutStat(){/* maybe do nothing */};
};
class Desend : public Base{
public:
void PutStat() override{/* do something */};
};
方法PutStat将打印一些统计信息。我希望从Base继承的每个Descendants实例都可以在破坏时自动打印统计信息。
这里输出stat-message似乎是一个常见的功能,所以我认为在Base中调用PutStat一次比在每个后代中单独调用PutStat更合理。
不幸的是,由于Base中的析构函数是虚拟的,因此将调用未覆盖的PutSat。
那么如何在Base析构函数中调用PutStat的覆盖版本。
答案 0 :(得分:1)
不幸的是,由于Base中的析构函数是虚拟的,因此将调用未覆盖的PutSat。
正确,但不是因为这个原因。虚拟析构函数与它无关。将调用基类的方法,因为该对象已被部分销毁回基类,其中包括使其VFT成为基类实例的VFT。
如何调用被覆盖的版本
你不能。它已经消失了。对象已经消失了。它没有意义,所以C ++不允许它。