C++ 多态核心原理与实现细节
一、多态的概念
多态(Polymorphism)是面向对象编程的灵魂之一。通俗来说,就是'多种形态'。它让同一个接口在不同对象上表现出不同的行为,从而大大提升了代码的复用性、扩展性与灵活性。
多态分为编译时多态(静态多态)和运行时多态(动态多态)。
- 编译时多态:主要通过函数重载和函数模板实现。实参传给形参的参数匹配在编译时完成,通过参数不同达到多种形态。
- 运行时多态:重点在于完成某个行为(函数),传不同的对象就会完成不同的行为。比如同样是动物叫的行为,传猫对象过去是"喵",传狗对象过去是"汪汪"。
二、多态的定义及实现条件
多态是在继承关系下的类对象,去调用同一函数,产生了不同的行为。例如 Student 继承了 Person,Person 对象买票全价,Student 对象优惠买票。
要实现运行时多态,必须满足以下两个核心条件:
- 基类的指针或引用:必须是基类的指针或者引用调用虚函数。因为只有基类的指针或引用才能既指向基类对象又指向派生类对象。
- 虚函数重写:被调用的函数必须是虚函数,并且完成了虚函数重写/覆盖。派生类必须对基类的虚函数完成重写,基类和派生类之间才能有不同的函数,多态的不同形态效果才能达到。
1. 虚函数与重写
类成员函数前面加 virtual 修饰,那么这个成员函数被称为虚函数。注意非成员函数不能加 virtual 修饰。
class Person {
public:
virtual void BuyTicket() {
cout << "买票全价" << endl;
}
};
class Student : public Person {
public:
virtual void BuyTicket() {
cout << "买票半价" << endl;
}
};
对于多态实现,我们可以这样理解:即调用同一函数,产生了不同的行为。
虚函数的重写规则
虚函数的重写(Override):派生类中有一个跟基类完全相同的虚函数(返回值类型、函数名字、参数列表完全相同),称派生类的虚函数重写了基类的虚函数。
注意:在重写基类虚函数时,派生类的虚函数在不加
virtual关键字时,虽然也可以构成重写(因为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样使用。
#include <iostream>
std;
{
:
{
cout << << endl;
}
};
: Person {
:
{
cout << << endl;
}
};
{
p.();
}
{
Person p;
(p);
Student s;
(s);
;
}


