是否可以拥有虚拟删除操作符?我不是在讨论析构函数,我的意思是实际的运算符重载。
减去这个事实(在大多数情况下)重载新的和删除是错误的(是的,我已经知道它的异端),我想知道使用虚拟产生什么样的含义删除操作符。
我正在考虑尝试使用虚拟删除,因为有时我可能会有一个重载delete的子类,存储在基类指针中。从技术上讲,除非我有一个不同节点类型的树(如果你问我的话,首先是潜在的危险想法),我真的没有看到这个案例过于成熟。
我只是想知道虚拟或非虚拟删除操作符覆盖的潜在优缺点。
答案 0 :(得分:15)
您无法明确声明operator delete
为virtual
。
这是一个静态成员函数,即使您不提供关键字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 ,静态成员函数不能是虚拟的。
要工作,它们确实需要是静态的 - 它们用于为对象分配/释放内存,因此必须在对象开始构建之前/完成破坏之后发生。你显然不能让它为最终成为类的实例的内存分配内存,同时它依赖于已经是类的实例(这是一个虚函数)一样)。
类T的任何分配函数都是静态成员(即使未明确声明为静态成员)。
和§12.5/ 6:
类X的任何释放函数都是静态成员(即使未明确声明为静态成员)。
......对于任何关心官方声明的人。有趣的是,当你分配时它是一个“T级”,当你正在释放时它是一个“X级”。
答案 2 :(得分:4)
否 - 您不能拥有虚拟运算符delete - 特定于类的new
和delete
重载必须是静态成员函数 - 特定于类,而不是对象。
您不能拥有虚拟静态成员函数。
参见标准12.5.7节,其中说明“由于成员分配和释放功能是静态的,因此它们不能是虚拟的。”
答案 3 :(得分:-3)
1)是的,当然你可以重载删除。不,重载不能是虚函数。
2)“利弊”完全取决于你想要做的事情。
3)当然,运算符重载的整个想法 - 就像在C ++中一样 - 可以说是愚蠢的,不必要的和危险的。
SOOOOOO .....
4)如果你不需要它,那么就不要做它:)
... IMHO