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
名称可以通过嵌套声明性区域或派生类中的相同名称的显式声明来隐藏.
如果虚拟成员函数vf在类Base和Derived类中声明,直接或间接从Base派生,则声明具有与Base :: vf相同名称和相同参数列表的成员函数vf,然后Derived :: vf也是虚拟的,它覆盖了 Base :: vf.
如果为同一范围内的单个名称指定了两个或更多不同的声明,则称该名称为重载.
所以这显然是一个隐藏的案例.
函数重载是指在参数列表中有不同的函数,或者如果它们是成员函数,则在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)
以防万一,目前还不清楚:基于这些定义,我想在这里呼吁有关的场景压倒一切.
重载是定义具有相同名称但签名不同的多个方法的过程; 覆盖是指子类中的函数与父类中的虚函数具有相同的签名.
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)