从基类的虚析构函数调用后代的覆盖方法

时间:2016-04-06 01:43:51

标签: c++

我们说我们的代码如下:

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的覆盖版本。

1 个答案:

答案 0 :(得分:1)

  

不幸的是,由于Base中的析构函数是虚拟的,因此将调用未覆盖的PutSat。

正确,但不是因为这个原因。虚拟析构函数与它无关。将调用基类的方法,因为该对象已被部分销毁回基类,其中包括使其VFT成为基类实例的VFT。

  

如何调用被覆盖的版本

你不能。它已经消失了。对象已经消失了。它没有意义,所以C ++不允许它。