首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重载与重载

重载与重载
EN

Stack Overflow用户
提问于 2011-03-23 22:12:12
回答 4查看 5.7K关注 0票数 12

我对这两个术语有点困惑,很高兴能澄清一些疑问。

据我所知,function overloading意味着在同一个类中有多个方法具有相同的名称,但参数的数量不同,参数的类型不同,或者参数的序列与返回类型无关,这对损坏的函数名称没有任何影响。

上述定义是否也包括"....in同一类或跨相关类(通过继承相关).....“

Function Overriding与虚函数、相同的方法签名(在基类中声明为虚)以及在子类中的实现被重写有关。

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

代码语言:javascript
复制
#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,但只是需要澄清一下,因为我碰巧记得术语overriding专门用于虚函数。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-23 22:14:25

在这种情况下,两者都不是。派生类方法hides基类方法。

票数 9
EN

Stack Overflow用户

发布于 2011-05-06 20:32:57

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

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

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

如果在类Base和派生类(直接或间接从Base派生)中声明虚拟成员函数vf,则声明具有与Base::vf相同名称和相同参数列表的成员函数vf,则Derived::vf也是虚的,并且它重写Base::vf。

  • 重载是指同一名称的多个声明共存于同一作用域(13/1)

当为同一作用域中的单个名称指定了两个或多个不同的声明时,该名称被称为重载。

  • 相关,也可以使用自己的实现(18.4.1.1/2、18.4.1.1/6、18.4.1.1/11、18.4.1.2)来替换运算符和从标准库中删除。

因此,这显然是一个隐藏的案例。

票数 10
EN

Stack Overflow用户

发布于 2011-05-06 20:55:44

Function overloading是指您有几个函数的参数列表不同,或者,如果它们是成员函数,则它们的不同(在其他一些语言中,您也可以基于返回类型进行重载,但C++不允许这样做。)

示例:

代码语言:javascript
复制
void f(int);
void f(char);

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

Function overriding是指当您使用相同的签名重新定义一个基类函数时。通常,只有当基类函数是虚函数时,这才有意义,否则要调用的函数(基类或派生类的版本)是在编译时使用引用/指针的静态类型确定的。

示例:

代码语言:javascript
复制
class base {
  void f();
  virtual void g();
};

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

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

示例:

代码语言:javascript
复制
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)!
}

只是为了防止不清楚:基于这些定义,我会在这里调用有问题的场景覆盖。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5406533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档