【问题标题】:new/delete "override" vs. "overload"新建/删除“覆盖”与“重载”
【发布时间】:2011-04-14 03:45:59
【问题描述】:

我一直以为……

  • 覆盖意味着在基类中重新实现一个函数(相同的签名),而
  • 重载意味着实现一个同名但不同签名的函数

... 并感到困惑,因为有时人们只是不关心差异。

关于新/删除:它们是重载还是被覆盖?

一个想法:

  • 在 Class = 重载中实现 new/delete 运算符
  • 重新实现全局 new/delete = override

有任何更正/建议/反对意见吗? 并随时标记问题“头发分裂”......

【问题讨论】:

    标签: c++ overloading new-operator overriding delete-operator


    【解决方案1】:

    对于全局operator newoperator delete,它实际上既不是重载也不是覆盖。允许程序替换默认的、实现提供的定义与它自己的定义。 C++ 标准说(§3.7.3/2):

    该库为全局分配和释放函数提供默认定义。一些全局分配和释放函数是可替换的 (18.4.1)。 C++ 程序应最多提供一个可替换分配或解除分配函数的定义。任何此类函数定义都会替换库 (17.4.3.4) 中提供的默认版本。

    对于特定于类的operator newoperator delete,运算符被重载

    【讨论】:

    • 所以重载和覆盖在这里同样是错误的,这就解释了使用中的 50-50 分布:-)
    • James:虽然我认为您写的内容是正确的,但您仍然可以重载两个全局运算符,其中包含附加(或不同)参数的运算符。事实上,std lib 至少带有重载:一个新位置和nothrow 变体。
    • @sbi:对。好吧,全局运算符是重载的,每个重载都可以替换。 @spc-mrn:是的,有效。
    猜你喜欢
    • 2010-10-24
    • 2012-09-13
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    相关资源
    最近更新 更多