c++ 重载与重写

brc7rcf0  于 2023-02-26  发布在  其他
关注(0)|答案(4)|浏览(242)

我对这两个术语有点困惑,希望澄清一些疑问。
据我所知,function overloading意味着在同一个类中有多个同名的方法,但无论返回类型如何,都有不同数量的参数、不同类型的参数或参数序列,这对函数的名称不起作用。
上述定义是否还包括“......在同一类中或跨相关类(通过继承相关)......”
Function Overriding与虚函数相关,方法签名相同(在基类中声明为虚),并在子类中实现时被覆盖。
我想知道一个场景,下面是代码:

#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;

}

在上述情景中,可以说:
派生类中的方法overrides基类OR中的方法
派生类中的方法overloads基类中的方法
重载是否适用于跨类作用域,重写术语是否不一定适用于虚函数?
我认为它应该是overrides,但只是需要澄清一下,因为我碰巧记得重写这个术语是专门用于虚函数的。

xmq68pz9

xmq68pz91#

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

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

  • 重写是指在派生类中替换虚成员(请参见10.3/2)

如果虚成员函数vf在Base类和Derived类中声明,直接或间接从Base派生,则声明与Base::vf同名和相同参数列表的成员函数vf,则Derived::vf也是虚的,并且它 * 覆盖 * Base::vf。

  • 重载是指在同一作用域中对同一名称同时存在多个声明(13/1)

当在同一作用域中为一个名称指定了两个或多个不同的声明时,该名称被称为“overloaded”。

  • 与此相关,还可以通过自己的实现从标准库中替换操作符new和delete(18.4.1.1/2、18.4.1.1/6、18.4.1.1/11、18.4.1.2)

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

6l7fqoea

6l7fqoea2#

在这种情况下,派生类方法隐藏了基类方法。

brccelvz

brccelvz3#

函数***重载***是当你有几个函数,它们的参数列表***不同,或者,如果它们是成员函数,它们的***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();
};

函数***隐藏***是在派生类中定义函数时(或内部作用域),该函数与基类中声明的同名函数具有**不同的参数列表***(或外部作用域)。在这种情况下,派生类的函数(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)!
}

以防万一我说不清楚:基于这些定义,我将这里讨论的场景称为"覆盖"。

pvabu6sv

pvabu6sv4#

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

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); 
};

相关问题