📜  C++ 中的函数重载与函数覆盖

📅  最后修改于: 2021-09-12 11:28:07             🧑  作者: Mango

函数重载(在编译时实现)

它通过改变签名来提供函数的多个定义,即改变参数的数量,改变参数的数据类型,返回类型没有任何作用。

  • 它可以在基类和派生类中完成。
  • 例子:
void area(int a);
void area(int a, int b); 
CPP
// CPP program to illustrate
// Function Overloading
#include 
using namespace std;
 
// overloaded functions
void test(int);
void test(float);
void test(int, float);
 
int main()
{
    int a = 5;
    float b = 5.5;
 
    // Overloaded functions
    // with different type and
    // number of parameters
    test(a);
    test(b);
    test(a, b);
 
    return 0;
}
 
// Method 1
void test(int var)
{
    cout << "Integer number: " << var << endl;
}
 
// Method 2
void test(float var)
{
    cout << "Float number: "<< var << endl;
}
 
// Method 3
void test(int var1, float var2)
{
    cout << "Integer number: " << var1;
    cout << " and float number:" << var2;
}


CPP
// CPP program to illustrate
// Function Overriding
#include
using namespace std;
 
class BaseClass
{
public:
    virtual void Display()
    {
        cout << "\nThis is Display() method"
                " of BaseClass";
    }
    void Show()
    {
        cout << "\nThis is Show() method "
               "of BaseClass";
    }
};
 
class DerivedClass : public BaseClass
{
public:
    // Overriding method - new working of
    // base class's display method
    void Display()
    {
        cout << "\nThis is Display() method"
               " of DerivedClass";
    }
};
 
// Driver code
int main()
{
    DerivedClass dr;
    BaseClass &bs = dr;
    bs.Display();
    dr.Show();
}


输出:

Integer number: 5
Float number: 5.5
Integer number: 5 and float number: 5.5

函数覆盖(在运行时实现)
它是在其派生类中重新定义具有相同签名即返回类型和参数的基类函数。

  • 它只能在派生类中完成。
  • 例子:
Class a
{
public: 
      virtual void display(){ cout << "hello"; }
};

Class b:public a
{
public: 
       void display(){ cout << "bye";}
};

CPP

// CPP program to illustrate
// Function Overriding
#include
using namespace std;
 
class BaseClass
{
public:
    virtual void Display()
    {
        cout << "\nThis is Display() method"
                " of BaseClass";
    }
    void Show()
    {
        cout << "\nThis is Show() method "
               "of BaseClass";
    }
};
 
class DerivedClass : public BaseClass
{
public:
    // Overriding method - new working of
    // base class's display method
    void Display()
    {
        cout << "\nThis is Display() method"
               " of DerivedClass";
    }
};
 
// Driver code
int main()
{
    DerivedClass dr;
    BaseClass &bs = dr;
    bs.Display();
    dr.Show();
}

输出:

This is Display() method of DerivedClass
This is Show() method of BaseClass

函数重载 VS函数重载:

  1. 继承:当一个类从另一个类继承时,就会发生函数的覆盖。重载可以在没有继承的情况下发生。
  2. 函数签名:重载函数的函数签名必须不同,即参数数量或参数类型应该不同。在覆盖中,函数签名必须相同。
  3. 函数范围:覆盖的函数在不同的范围内;而重载的函数在同一范围内。
  4. 函数的行为:当派生类函数必须做一些与基类函数不同的添加或不同的工作时,需要覆盖。重载用于具有相同名称的函数,它们的行为取决于传递给它们的参数。
想要从精选的视频和练习题中学习,请查看C++ 基础课程,从基础到高级 C++ 和C++ STL 课程,了解基础加 STL。要完成从学习语言到 DS Algo 等的准备工作,请参阅完整的面试准备课程