如果派生中没有数据成员,C是虚拟析构函数还是需要的吗?

假设我有这个代码
class Base{
  public:
        int getVal();
  private:
         int a,b;
};

class Derived::public Base{
    public:
         void printval();
};

int main(){
    Base *b = new Derived();
    delete b;    
}

我知道一个虚拟析构函数会正确删除事物,但是使用基本指针(当没有虚拟析构函数)时,即使在派生类中没有虚拟函数也没有数据成员,这是不好的.如果这样做会发生什么?

解决方法

对于原始类型的数据,您的示例很可能在实践中工作.事实上,引发一个vtable可能会阻碍性能(因此这里可能有一些合法用途),但是在5.3-5.4中它在技术上是未定义的:

If the static type of the operand [of
the delete operator] is different from
its dynamic type,the static type
shall be a base class of the operand’s
dynamic type and the static type shall
have a virtual destructor or the
behavIoUr is undefined.

它完全取决于你的类中数据的“堆积”,而没有堆分配的成员(在你的情况下),你应该是好的,但它绝对是一个代码的气味.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...