重载vs重写

Alo*_*ave 12 c++ overriding overloading

我对这两个术语感到有些困惑,并且很乐意澄清一些疑问.

据我所知,function overloading意味着在同一个类中具有多个方法,这些方法具有相同的名称但是具有不同数量的参数,不同类型的参数或参数序列,而不管返回类型如何对函数的错位名称没有影响.

上述定义是否还包括"....在同一个类或相关类中(通过继承相关)......"

并且Function Overriding与虚函数,相同的方法签名(在Base类中声明为虚拟)和在子类中实现的重写有关.

我想知道一个场景,以下是代码:

#include <iostream>

class A
{
    public:
    void doSomething(int i, int j)
    {
        cout<<"\nInside A::doSomething\n";
    }
};

class B: public A
{
    public:
    void doSomething(int i, int j)
    {
        cout<<"\nInside B::doSomething\n";

    }
};

int main()
{
    B obj;
    obj.doSomething(1,2);
    return 0;

} 
Run Code Online (Sandbox Code Playgroud)

在上述情况下,什么可以说:
在派生类的方法,overrides在基类的方法OR
中派生类的方法,overloads在基类的方法

重载是否适用于类范围,并且覆盖术语是否不一定适用于虚函数?

我认为它应该是overrides,但只需要澄清,因为我碰巧记得术语覆盖被特别用于虚函数.

APr*_*mer 10

  • 隐藏是指由于嵌套作用域或派生类(3.3.7/1)中的声明而无法访问作用域中的定义.

名称可以通过嵌套声明性区域或派生类中的相同名称的显式声明来隐藏.

  • 覆盖是在派生类中替换虚拟成员时(见10.3/2)

如果虚拟成员函数vf在类Base和Derived类中声明,直接或间接从Base派生,则声明具有与Base :: vf相同名称和相同参数列表的成员函数vf,然后Derived :: vf也是虚拟的,它覆盖了 Base :: vf.

  • 重载是指在同一范围内多个声明共存同名时(13/1)

如果为同一范围内的单个名称指定了两个或更多不同的声明,则称该名称为重载.

  • 相关的,也有更换运营商new和delete标准库中由自己实施的可能性(18.4.1.1/2,18.4.1.1/6,18.4.1.1/11,18.4.1.2)

所以这显然是一个隐藏的案例.


Bjö*_*lex 9

在这种情况下都没有.derived-class方法隐藏了基类方法.

  • 有时隐藏一个函数称为重载 - 实际上你在静态类型`this`以及"其他"参数的类型上重载.但除非你替换基类中的所有重载,否则你会减去和添加,所以它与仅仅重载一个自由函数并不完全相同.因此可能使用"过载"是不正确的,但我当然遇到过它并自己使用它. (3认同)

sbi*_*sbi 7

函数重载是指在参数列表中有不同的函数,或者如果它们是成员函数,则在const/ volatile资格中.(在其他一些语言中,您也可以根据返回类型重载,但C++不允许这样做.)
示例:

void f(int);
void f(char);

class some_class {
  void g();
  void g() const;
};
Run Code Online (Sandbox Code Playgroud)

函数重写是指重新定义具有相同签名的基类函数.通常这只有在基类函数是虚函数时才有意义,因为否则要调用的函数(基类或派生类'版本)是在编译时使用引用/指针的静态类型确定的.
例子:

class base {
  void f();
  virtual void g();
};

class derived : public base {
  void f();
  void g();
};
Run Code Online (Sandbox Code Playgroud)

函数隐藏是指在派生类(或内部作用域)中定义函数,该函数具有与在基类(或外部作用域)中声明的具有相同名称的函数不同的参数列表.在这种情况下,派生类的函数隐藏了基类函数.您可以通过使用声明将基类函数显式地放入派生类的作用域来避免这种情况using.
例子:

class base {
  void f(int);
  void f(char);
};

class derived1 : public base {
  void f(double);
};

void f()
{
  derived1 d;
  d.f(42); // calls derived1::f(double)!
}

class derived2 : public base {
  using base::f; // bring base class versions into derived2's scope
  void f(double);
};

void g()
{
  derived2 d;
  d.f(42); // calls base::f(int)!
}
Run Code Online (Sandbox Code Playgroud)

以防万一,目前还不清楚:基于这些定义,我想在这里呼吁有关的场景压倒一切.

  • 无论如何,*覆盖*在10.3/2的标准中定义,而我无法找到其他任何地方.那提到完全是指虚函数,我找不到在C++ 03中引用非虚函数的字符串"overrid"的任何用法.当然,不同的人使用不同的术语,但据我所知,C++标准术语是override => virtual. (3认同)

mea*_*gar 5

重载是定义具有相同名称但签名不同的多个方法的过程; 覆盖是指子类中的函数与父类中的虚函数具有相同的签名.

class Test {
  // Test::func is overloaded
  virtual void func(int x);
  virtual void func(double y);
};

class Child : public Test {
  // Child::func overrides Test::func
  virtual void func(int x); 
};
Run Code Online (Sandbox Code Playgroud)