C++ 中的多态和方法覆盖

原文:https://www.studytonight.com/cpp/function-overriding.php

在本教程中,我们将介绍 C++ 中的多态和 C++ 中的函数覆盖的概念。我们还将通过简单的代码示例看到这两者的作用。


C++ 中的多态

多态意味着一件事情有多种形式。在继承中,当超类和子类都有相同声明但定义不同的成员函数时,就通过方法覆盖来实现多态。


C++ 中的方法覆盖

如果我们将一个类继承到派生类中,并在派生类中再次为基类的一个函数提供定义,那么该函数被称为覆盖,这种机制被称为函数覆盖


覆盖函数的要求

  1. 传承应该在那里。函数覆盖不能在类中完成。为此,我们需要一个派生类和一个基类。
  2. 被重定义的函数在基类和派生类中必须具有完全相同的声明,这意味着相同的名称、相同的返回类型和相同的参数列表。

C++ 中函数覆盖的例子

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

class Derived:public Base
{
    public:
    void show()
    {
        cout << "Derived Class";
    }
}

在本例中,函数show()在派生类中被覆盖。现在让我们研究这些被覆盖的函数是如何在main()函数中被调用的。


用类对象绑定函数调用

将函数调用连接到函数体称为绑定。当它在程序运行前完成时,称为早期绑定或静态绑定或编译时绑定。

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

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

int main()
{
    Base b;       //Base class object
    Derived d;     //Derived class object
    b.show();     //Early Binding Ocuurs
    d.show();   
}

基类派生类

在上面的例子中,我们使用基类和派生类对象来调用覆盖函数。基类对象将调用函数的基版本,派生类的对象将调用函数的派生版本。


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

但是当我们使用基类的指针或引用来保存派生类的对象时,函数调用 Binding 会给出一些意想不到的结果。

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

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

int main()
{
    Base* b;       //Base class pointer
    Derived d;     //Derived class object
    b = &d;
    b->show();     //Early Binding Occurs
}

基类

在上面的示例中,虽然对象属于派生类,但是仍然调用基类的方法。这是由于早期绑定造成的。

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