我对这两个术语有点困惑,希望澄清一些疑问。
据我所知,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
,但只是需要澄清一下,因为我碰巧记得重写这个术语是专门用于虚函数的。
4条答案
按热度按时间xmq68pz91#
可以通过在嵌套声明区域或派生类中显式声明同一名称来隐藏名称。
如果虚成员函数vf在Base类和Derived类中声明,直接或间接从Base派生,则声明与Base::vf同名和相同参数列表的成员函数vf,则Derived::vf也是虚的,并且它 * 覆盖 * Base::vf。
当在同一作用域中为一个名称指定了两个或多个不同的声明时,该名称被称为“overloaded”。
所以很明显这是一个隐藏的案例。
6l7fqoea2#
在这种情况下,派生类方法隐藏了基类方法。
brccelvz3#
函数***重载***是当你有几个函数,它们的参数列表***不同,或者,如果它们是成员函数,它们的***
const
/volatile
限定不同***。(在其他一些语言中,你也可以根据返回类型重载,但是C++不允许这样做。)示例:
函数***重写***是当你***重新定义***一个具有***相同签名***的基类函数时。通常只有当基类函数是虚函数时,这才有意义,因为否则要调用的函数(基类或派生类的版本)是在编译时使用引用/指针的 * 静态类型 * 确定的。
示例:
函数***隐藏***是在派生类中定义函数时(或内部作用域),该函数与基类中声明的同名函数具有**不同的参数列表***(或外部作用域)。在这种情况下,派生类的函数(s) 隐藏 * 基类函数通过
using
声明显式地将基类函数引入派生类的作用域,可以避免这种情况。示例:
以防万一我说不清楚:基于这些定义,我将这里讨论的场景称为"覆盖"。
pvabu6sv4#
重载是定义名称相同但签名不同的多个方法的过程;重写是指子类中的函数与父类中的虚函数具有相同的签名。