Ser*_*rge 14 c++ virtual inheritance operator-overloading delete-operator
是否可以拥有虚拟删除操作符?我不是在讨论析构函数,我的意思是实际的运算符重载.
减去这个事实(在大多数情况下)重载新的和删除是一个很大的坏主意(是的,我已经知道它是异端),我想知道使用虚拟删除操作符会产生什么样的影响.
我正在考虑尝试使用虚拟删除,因为有时我可能有一个重载delete的子类,存储在基类指针中.从技术上讲,我真的没有看到这种情况会产生过多的结果,除非我有一个不同节点类型的树(如果你问我,首先是潜在的危险想法).
我只是想知道虚拟或非虚拟删除操作符覆盖的潜在优缺点.
Che*_*Alf 15
你不能明确声明operator delete为virtual.
即使您不提供关键字,它也是静态成员函数static.
但是,在使用最派生类中定义的那个的意义上,operator delete 它已经是虚拟的.您可能会选择将其视为析构函数调用它.甚至可能是.;-)
C++11§12.4/ 12:
"在定义虚拟析构函数(包括隐式定义(12.8))时,在析构函数类(10.2)的范围内查找非数组释放函数,并且,如果没有找到声明,则在全局范围内查找该函数."
C++11§12.5/ 4:
"如果delete-expression以一元运算::符开头,则在全局范围内查找释放函数的名称.否则,如果使用delete-expression释放静态类型具有虚拟析构函数的类对象,则释放函数是在动态类型的虚拟析构函数(12.4)的定义点处选择的函数.117否则,如果使用delete-expression释放类T或其对象的对象,则对象的静态和动态类型应相同,并且在范围内查找释放函数的名称T.如果此查找未能找到名称,则在全局范围中查找该名称.如果查找结果不明确或不可访问,或者查找选择了放置重新分配函数,则程序格式不正确."
否 - 即使你没有这样标记,当/如果你重载new/ delete为一个类,它们最终成为静态成员函数1,静态成员函数不能是虚拟的.
要工作,它们确实需要是静态的 - 它们用于为对象分配/释放内存,因此必须在对象开始构建之前/完成破坏之后发生.你显然不能让它为最终成为类的实例的内存分配内存,同时它依赖于已经是类的实例(虚函数所做的).
类T的任何分配函数都是静态成员(即使未明确声明为static).
和§12.5/ 6:
类X的任何释放函数都是静态成员(即使没有显式声明为static).
......对于任何关心官方声明的人.有趣的是,当你分配时,它是一个"T级",当你自由时它是一个"X级".
| 归档时间: |
|
| 查看次数: |
3889 次 |
| 最近记录: |