多态
在 C++ 的世界里,多态是面向对象编程的灵魂之一。它让同一个接口在不同对象上表现出不同的行为,从而大大提升了代码的复用性、扩展性与灵活性。本文将带你深入理解多态的核心原理,从概念、实现条件、虚函数、重写规则,到虚函数表与动态绑定机制,逐步揭开多态背后的运行逻辑。
一、多态的概念
通俗来说,就是'多种形态'。多态分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态主要指函数重载和模板,通过参数匹配在编译期完成;运行时多态则是重点,即调用同一函数时,根据传入对象的不同类型执行不同行为。比如买票,普通人全价,学生优惠,军人优先;再比如动物叫,猫叫喵,狗叫汪。
二、多态的定义及实现
多态发生在继承关系下,基类指针或引用调用虚函数产生不同行为。例如 Student 继承 Person,Person 买票全价,Student 买票半价。
2.1 多态的构成条件
- 必须是基类的指针或者引用调用虚函数。
- 被调用的函数必须是虚函数,并且完成了虚函数重写/覆盖。
解释:只有基类的指针或引用才能既指向基类对象又指向派生类对象;派生类必须对基类的虚函数完成重写,否则无法体现不同形态。
2.1.2 虚函数
类成员函数前加 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 BuyTicket() { cout << << endl; }
};
: Person {
:
{ cout << << endl; }
};
{ p.(); }
{
Person p; (p);
Student s; (s);
}
{
();
;
}


