在本教程中,我们将结合代码示例介绍 C++ 中的多态和 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()
函数,而不知道实际的对象类型。