C++ 中的多态和方法覆盖
在本教程中,我们将介绍 C++ 中的多态和 C++ 中的函数覆盖的概念。我们还将通过简单的代码示例看到这两者的作用。
C++ 中的多态
多态意味着一件事情有多种形式。在继承中,当超类和子类都有相同声明但定义不同的成员函数时,就通过方法覆盖来实现多态。
C++ 中的方法覆盖
如果我们将一个类继承到派生类中,并在派生类中再次为基类的一个函数提供定义,那么该函数被称为覆盖,这种机制被称为函数覆盖
覆盖函数的要求
- 传承应该在那里。函数覆盖不能在类中完成。为此,我们需要一个派生类和一个基类。
- 被重定义的函数在基类和派生类中必须具有完全相同的声明,这意味着相同的名称、相同的返回类型和相同的参数列表。
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()
函数的调用,而不知道实际的对象类型。