方法签名、重载、覆盖:所有这些术语是否相关?

Method signatures, overloading, overriding: are all these terms related?

术语 "overloading" 和 "overriding" 听起来非常相似(这就是为什么它们有时相互对立),但这两个概念在技术上是否相关?

  1. 术语 "overloading" 和 "overriding" 相关吗?

术语 "overloading" 取决于 "method signature" 定义。所以我有一个类似的问题。

  1. (相关)术语“method signature”是否也与 "overriding" 相关?

重载是指多个函数同名但参数不同。例如

例如

void SayHi(string name) { ... }
void SayHi(string, int age) {.... }

这些是重载。

覆盖 "replaces" 现有函数,因此您使用现有函数并提供一个具有相同名称和相同参数的全新函数

class Person
{
    public virtual void SayHi(string name)
    {
        // ....
    }
}

class Teenager : Person
{
    public override void SayHi(string name)
    {
        // ....
    }
}

方法签名与重写相关,新的重写函数必须与其尝试重写的方法具有相同的方法签名,并且 return 类型相同。

方法签名与重载相关,重载必须具有不同的方法签名。

重载是指具有相同方法或函数名称的多个版本,其中每个版本都有不同的参数类型,例如。 C++ 中的 init( int, int )init( const char * ),具有特定于参数类型的实现。编译器将 select 根据您在特定调用中使用的参数调用哪个版本。方法签名指的是参数的类型和顺序。对于重载,方法的不同版本的方法签名必须不同。

覆盖是指派生 class 实现它自己的在基础 class 中声明的方法版本,用特定于派生class。对于覆盖,derived-class 方法的方法签名必须与 base-class 方法的方法签名相同。如果不同,则派生的 class 正在重载 base-class 方法,而不是覆盖它。