C++ 函数重载



C++ 中的多态和重载

在本教程中,我们将结合代码示例介绍 C++ 中的多态和 C++ 中的函数重载的概念。



C++ 中的多态性

多态是指一个事物具有多种形式,在继承中,当父类和子类都具有具有相同声明但定义不同的成员函数时,通过函数重载来完成多态性。



C++ 中的方法覆盖

如果我们继承了一个基类,并在派生类中再次为基类的某个函数重新实现,则该函数被称为重载,这种机制称为函数重载



重载函数的要求

  1. 继承是前提,函数重载不能在一个类中完成,因此,我们至少需要一个派生类和一个基类。

  2. 重新实现的函数在基类和派生类中必须有完全相同的声明,即相同的名称、相同的返回类型和相同的参数列表。



C++ 中的函数重载示例

class Base
{
public:
    void show()
    {
        cout << "基类";
    }
};

class Derived:public Base
{
public:
    void show()
    {
        cout << "派生类";
    }
}

在此示例中,函数 show() 在派生类中被重载,现在让我们研究一下如何在 main() 函数中调用这些被重载的 函数



函数调用与类对象绑定

将函数调用连接到函数体称为绑定,当它在程序运行之前完成时,它称为早期绑定静态绑定编译时绑定。(不要急,晚期绑定我们在下一节介绍)

class Base
{
public:
    void shaow()
    {
        cout << "基类\n";
    }
};

class Derived : public Base
{
public:
    void show()
    {
        cout << "派生类\n";
    }
}

int main()
{
    Base b;       //基类对象
    Derived d;     //派生类对象
    b.show();     // 早期绑定
    d.show();   
}

以上实例输出结果:

基类
派生类

在上面的示例中,我们使用基类和派生类对象调重载函数,基类对象将调用函数的基础版本,派生类的对象将调用函数的派生版本。



使用基类指针的函数调用绑定

但是当我们使用 Base 类的指针或引用来保存 Derived 类的对象时,函数绑定会有一些意想不到的结果。

class Base
{
public:
    void show()
    {
        cout << "基类\n";
    }
};

class Derived:public Base
{
public:
    void show()
    {
        cout << "派生类\n";
    }
}

int main()
{
    Base* b;       //基类指针
    Derived d;     //派生类对象
    b = &d;
    b->show();     //早期绑定
}

以上实例输出结果:

基类

在上面的例子中,虽然对象是 Derived 类,但仍然调用 Base 类的方法,这是由于早期绑定的原因。

编译器看到基类的指针,直接调用基类的show()函数,而不知道实际的对象类型。