区分函数重载和函数覆盖

Posted

技术标签:

【中文标题】区分函数重载和函数覆盖【英文标题】:Differentiate between function overloading and function overriding 【发布时间】:2012-08-08 08:48:40 【问题描述】:

C++中函数重载和函数覆盖的区别?

【问题讨论】:

奇怪,我找不到这个问题的副本! 这是一个问题吗?还是命令? 对我来说听起来像是一个面试问题。 【参考方案1】:

在 C++ 中重载方法(或函数)是定义同名函数的能力,只要这些方法具有不同的签名(不同的参数集)。方法重写是继承类重写基类的虚方法的能力。

a) 在重载中,同一类中可用的方法之间存在关系,而在覆盖中,超类方法和子类方法之间存在关系。

(b) 重载不会阻止从超类继承,而重写会阻止从超类继承。

(c) 在重载中,不同的方法共享相同的名称,而在重写中,子类方法替换超类。

(d) 重载必须有不同的方法签名,而重写必须有相同的签名。

【讨论】:

啊,接受的答案不是最佳答案的现象...... ;) 最好的答案,有很好的解释。谢谢!【参考方案2】:

当你想要相同的具有不同参数的函数时,会完成函数重载

void Print(string s);//Print string
void Print(int i);//Print integer

函数重写是为了给基类中的函数赋予不同的含义

class Stream//A stream of bytes

public virtual void Read();//read bytes


class FileStream:Stream//derived class

public override void Read();//read bytes from a file

class NetworkStream:Stream//derived class

public override void Read();//read bytes from a network

【讨论】:

有例子让这个答案更容易理解【参考方案3】:

当您更改方法签名中参数的原始类型时,您正在实施重载。

当您更改派生类中方法的原始实现时,您正在实施覆盖。

【讨论】:

“更改方法的原始定义”不够精确。【参考方案4】:

覆盖意味着,对具有相同参数的现有函数给出不同的定义, 而重载意味着为现有函数添加不同的定义,并带有不同的参数。

例子:

#include <iostream>

class base
    public:
    //this needs to be virtual to be overridden in derived class
    virtual void show()std::cout<<"I am base";
    //this is overloaded function of the previous one
    void show(int x)std::cout<<"\nI am overloaded"; 
;

class derived:public base
    public:
    //the base version of this function is being overridden
    void show()std::cout<<"I am derived (overridden)";
;


int main()
    base* b;
    derived d;
    b=&d;
    b->show();  //this will call the derived overriden version
    b->show(6); // this will call the base overloaded function

输出:

I am derived (overridden)
I am overloaded

【讨论】:

【参考方案5】:

1.函数重载是指一个类中存在多个同名函数。 函数覆盖是指函数在基类和派生类中具有相同的原型。

2.函数重载可以在没有继承的情况下发生。 当一个类继承自另一个类时,就会发生函数覆盖。

3.重载的函数要么参数数量不同,要么参数类型不同。 重写的函数参数必须相同。

有关更多详细信息,您可以访问下面的链接,在该链接中您可以获得有关 C++ 中函数重载和覆盖的更多信息 https://googleweblight.com/i?u=https://www.geeksforgeeks.org/function-overloading-vs-function-overriding-in-cpp/&hl=en-IN

【讨论】:

【参考方案6】:

函数重载是同名函数但参数不同。函数重载意味着同名函数,同参数

【讨论】:

【参考方案7】:

Function overloading - 具有相同名称但参数数量不同的函数

Function overriding - 继承的概念。具有相同名称和相同数量参数的函数。这里说第二个函数覆盖了第一个函数

【讨论】:

【参考方案8】:

重载具有不同参数的同名函数,而重载具有相同名称和相同参数的函数时,将基类替换为派生类(继承类)

【讨论】:

【参考方案9】:

函数重载可能有不同的返回类型,而函数覆盖必须有相同或匹配的返回类型。

【讨论】:

【参考方案10】:

重载意味着具有相同名称但不同签名的方法 重写意味着重写基类的虚方法......

【讨论】:

【参考方案11】:

除了现有的答案,覆盖的函数在不同的范围内;而重载的函数在同一范围内。

【讨论】:

以上是关于区分函数重载和函数覆盖的主要内容,如果未能解决你的问题,请参考以下文章

覆写(Override)和重载(Overload)的比较

java 重载和重写的区别

重载和覆写有啥区别?

重载覆盖

什么情况下是重载,什么情况下是重写,什么情况下是覆盖

14. 函数重载,函数覆盖,函数隐藏