C ++虚拟运算符删除?

时间:2012-12-16 00:10:54

标签: c++ inheritance operator-overloading virtual delete-operator

是否可以拥有虚拟删除操作符?我不是在讨论析构函数,我的意思是实际的运算符重载。

减去这个事实(在大多数情况下)重载新的和删除是错误的(是的,我已经知道它的异端),我想知道使用虚拟产生什么样的含义删除操作符。

我正在考虑尝试使用虚拟删除,因为有时我可能会有一个重载delete的子类,存储在基类指针中。从技术上讲,除非我有一个不同节点类型的树(如果你问我的话,首先是潜在的危险想法),我真的没有看到这个案例过于成熟。

我只是想知道虚拟或非虚拟删除操作符覆盖的潜在优缺点。

4 个答案:

答案 0 :(得分:15)

您无法明确声明operator deletevirtual

这是一个静态成员函数,即使您不提供关键字static

operator delete 已经是虚拟 ,因为使用了派生类最多的类。您可能会选择将其视为析构函数调用它。甚至可能是。 ; - )


  

C ++11§12.4/ 12
  “在定义虚拟析构函数(包括隐式定义(12.8))时,非数组   deallocation函数在析构函数的类(10.2)的范围内查找,如果没有声明的话   发现,该函数在全局范围内被查找。“


  

C ++11§12.5/ 4
  “如果 delete-expression 以一元::运算符开头,则会查找释放函数的名称   全球范围。否则,如果 delete-expression 用于释放静态类型具有的类对象   在虚拟析构函数中,释放函数是在动态定义点选择的函数   type的虚析构函数(12.4)。 117 否则,如果 delete-expression 用于释放一个对象   类T或其数组,对象的静态和动态类型应相同并且取消分配   函数的名称在T的范围内查找。如果此查找无法找到名称,则会查找该名称   全球范围。如果查找结果不明确或不可访问,或者查找选择了一个放置   解除分配功能,该程序格式不正确。“

答案 1 :(得分:7)

否 - 即使你没有这样标记,当/如果你为一个类重载new / delete,它们最终会成为静态成员函数 1 ,静态成员函数不能是虚拟的。

要工作,它们确实需要是静态的 - 它们用于为对象分配/释放内存,因此必须在对象开始构建之前/完成破坏之后发生。你显然不能让它为最终成为类的实例的内存分配内存,同时它依赖于已经类的实例(这是一个虚函数)一样)。


  1. §12.5/ 1:
  2.   

    类T的任何分配函数都是静态成员(即使未明确声明为静态成员)。

    和§12.5/ 6:

      

    类X的任何释放函数都是静态成员(即使未明确声明为静态成员)。

    ......对于任何关心官方声明的人。有趣的是,当你分配时它是一个“T级”,当你正在释放时它是一个“X级”。

答案 2 :(得分:4)

否 - 您不能拥有虚拟运算符delete - 特定于类的newdelete重载必须是静态成员函数 - 特定于类,而不是对象。

您不能拥有虚拟静态成员函数。

参见标准12.5.7节,其中说明“由于成员分配和释放功能是静态的,因此它们不能是虚拟的。”

答案 3 :(得分:-3)

1)是的,当然你可以重载删除。不,重载不能是虚函数。

2)“利弊”完全取决于你想要做的事情。

3)当然,运算符重载的整个想法 - 就像在C ++中一样 - 可以说是愚蠢的,不必要的和危险的。

SOOOOOO .....

4)如果你不需要它,那么就不要做它:)

... IMHO