重载vs重写

时间:2011-03-23 14:12:12

标签: c++ override 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;

} 

在上面的场景中,可以说:
Base类OR中派生类overrides方法中的方法 Base Class

中派生类overloads方法中的方法

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

我认为它应该是overrides,但只需要澄清,因为我碰巧记得专门用于虚函数的术语覆盖。

4 个答案:

答案 0 :(得分:10)

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

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

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

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

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

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

  • 相关,还有可能通过自己的实现替换标准库中的operator new和delete(18.4.1.1 / 2,18.4.1.1 / 6,18.4.1.1 / 11,18.4.1.2)

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

答案 1 :(得分:9)

在这种情况下都没有。派生类方法hides基类方法。

答案 2 :(得分:7)

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

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

class some_class {
  void g();
  void g() const;
};

功能 覆盖 重新定义 基类功能, 相同签名 即可。通常这只有在基类函数是虚函数时才有意义,因为否则要调用的函数(基类或派生类'版本)在编译时使用引用/指针的静态确定输入的。
示例:

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

class derived : public base {
  void f();
  void g();
};

函数 隐藏 是指在具有 不同参数列表的派生类(或内部范围)中定义函数 比在基类(或外部作用域)中声明的具有相同名称的函数。在这种情况下,派生类'function(s)隐藏基类函数。您可以通过使用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)!
}

以防万一不清楚:基于这些定义,我会在这里调用有问题的场景覆盖

答案 3 :(得分: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); 
};