多态
多态(polymorphism)是面向对象编程的灵魂之一。它让同一个接口在不同对象上表现出不同的行为,从而大大提升了代码的复用性、扩展性与灵活性。本文将深入理解多态的核心原理,从概念、实现条件、虚函数、重写规则,到虚函数表与动态绑定机制,逐步揭开多态背后的运行逻辑。
一、多态的概念
通俗来说,多态就是'多种形态'。分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态主要通过函数重载和模板实现,参数匹配在编译期完成;运行时多态则是通过基类指针或引用调用虚函数,根据实际对象类型决定执行哪个函数。比如同样是'买票'行为,普通人全价,学生优惠,军人优先。
二、多态的定义及实现
多态发生在继承体系下,基类指针或引用调用同一函数产生不同行为。例如 Student 继承 Person,Person 买票全价,Student 买票半价。
2.1 多态的构成条件
要实现多态,必须同时满足两个条件:
- 必须是基类的指针或者引用调用虚函数。
- 被调用的函数必须是虚函数,并且完成了虚函数重写/覆盖。
解释一下:只有基类的指针或引用才能既指向基类对象又指向派生类对象;而派生类必须对基类的虚函数完成重写,这样两者之间才有不同的函数实现,多态效果才能显现。
2.1.2 虚函数
类成员函数前加 virtual 修饰即为虚函数。注意非成员函数不能加 virtual。
class Person {
public:
virtual void BuyTicket() { cout << "买票全价" << endl; }
};
class Student : public Person {
public:
virtual void BuyTicket() { cout << "买票半价" << endl; }
};
即调用同一函数,产生了不同的行为。
2.1.3 虚函数的重写/覆盖
派生类中有跟基类完全相同的虚函数(返回值类型、函数名字、参数列表完全相同),称为重写。
注意:派生类重写时虽然可以不加 virtual 关键字(因为继承后属性保持),但为了规范建议加上。考试选择题常在此设坑。
#include <iostream>
using namespace std;
class Person {
public:
virtual void { cout << << endl; }
};
: Person {
:
{ cout << << endl; }
};
{ p.(); }
{
Person p;
(p);
Student s;
(s);
}
{
();
;
}


