是否有可能有一个虚拟delete运算符? 我不是说析构函数,我指的是实际操作符重载。
减去事实上,它是(在大多数情况下)大坏主意重载new和delete(是的,我已经知道这是异端邪说),我想知道什么样的影响都来自于使用虚拟delete运算符。
我想尝试使用虚拟删除,因为有时我可能有一子类重载删除,存储在一个基类指针。 从技术上讲,我真的不看到过这种情况即将太多修成正果,除非我有不同的节点类型的树(在第一位潜在危险的想法,如果你问我)。
我只是想知道这将是一个虚拟的,还是非虚拟的潜在利弊,删除操作符重载。
你不能显式声明operator delete
为virtual
。
这是一个静态成员函数,即使你不提供关键字static
。
但是operator delete
是在最派生类中定义的使用意义已经虚 。 您可以选择,就好像它是由析构函数调用来想起来。 它甚至可能。 ;-)
C ++ 11§12.4/ 12:
“在一个虚拟的析构函数的定义的点(包括隐式定义(12.8)),非阵列释放函数是在析构函数的类(10.2)的范围抬头,并且,如果没有声明被找到时,功能在全球范围内被抬起头来。”
C ++ 11§12.5/ 4:
“如果一个delete表达式用一元开始::
运算符,释放函数的名字在全球范围内抬头。 否则,如果删除-expression用于解除分配一个类对象,其静态类型有一个虚拟析构函数,解除分配的功能是在动态类型的虚拟析构函数(12.4)的定义的点中选择的一个。 117否则,如果delete表达式用于删除类的一个对象T
或其阵列,所述静态和动态类型的对象应是相同的,并且解除分配功能的名称中的范围的抬头T
。 如果查找无法找到名字,这个名字在全球范围内抬头。 如果查找的结果是不明确的或不可访问,或者如果所述查找选择放置释放函数,程序是非法的构造“。
否-即使你不进行相应的标记,当/如果你超载new
/ delete
的一类,他们最终的静态成员函数1,和静态成员函数不能是虚的。
为了工作,他们真正需要的是静态的 - 它们是用来分配/释放的某个对象的内存,所以要发生的对象开始施工前/它完成后销毁。 很显然你不能把它分配什么最终将成为一个类的实例内存,并在同一时间拥有它依赖于已经作为类(一个虚函数做)的一个实例。
- §12.5/ 1:
对于T类的任何分配函数是静态成员(即使没有明确声明为静态)。
和§12.5/ 6:
一类X任意释放函数是静态成员(即使没有明确声明为静态)。
...任何人谁在乎的官方声明。 有趣的是如何是一个“类T”当你分配,以及“X类”当你释放。
没有-你不能有一个虚拟运营商删除-类特定的new
和delete
重载必须是静态成员函数-具体到类,而不是对象。
你不能有虚静态成员函数。
看到标准,其中规定的部分12.5.7“自从构件分配和解除分配功能是静态它们不能是虚拟的。”
1)是的,当然你可以重载删除。 不,超载不能是虚函数。
2)“优点和缺点”取决于你想要做什么完全。
3)当然,操作符重载的整体思想 - 像在C这么多++ - 可以说是愚蠢的,不必要的和危险的。
SOOOOOO .....
4)如果你不需要它,那么不这样做:)
恕我直言...