C++ 多态详解
1. 多态的概念
多态分为编译时多态(静态)和运行时多态(动态)。编译时多态通常指函数重载和模板在编译期生成的实例,而本篇重点讨论运行时多态。
什么是运行时多态? 简单来说,就是同一个行为接口,传入不同的对象,会执行不同的逻辑。例如买票这个行为,普通人是全价,学生是优惠,军人优先;又如动物叫,猫对象调用输出'喵',狗对象调用输出'汪汪'。

2. 多态的定义及实现
多态是指继承体系下的类对象,调用同一函数却产生不同行为。比如 Student 继承自 Person,通过基类指针或引用调用虚函数时,实际执行的是派生类的版本。
实现多态必须满足两个条件:
- 必须是基类的指针或者引用调用虚函数。
- 被调用的函数必须是虚函数,并且完成了重写(Override)。
2.1 虚函数
虚函数是在类成员函数前加 virtual 修饰的函数。注意非成员函数不能加 virtual。
class Person {
virtual void BuyTicket() {
cout << "买票 - 全价" << endl;
}
};
2.2 虚函数的重写/覆盖
当派生类中存在一个与基类完全相同的虚函数(返回值类型、函数名、参数列表均相同),则称为重写了基类虚函数。即使派生类未加 virtual 关键字,只要继承关系存在且签名一致,也构成重写,但建议显式加上以保持规范。
namespace twg {
class Person {
public:
virtual void BuyTicket() {
cout << "买票 - 全价" << endl;
}
};
class Student : public Person {
public:
virtual void BuyTicket() {
cout << << endl;
}
};
{
:
{}
};
: Animal {
:
{
std::cout << << std::endl;
}
};
: Animal {
:
{
std::cout << << std::endl;
}
};
{
animal.();
}
}
{
twg::Cat cat;
twg::Dog dog;
twg::(cat);
twg::(dog);
;
}



