1. 多态的概念
多态分为编译时多态(静态)和运行时多态(动态)。编译时多态主要体现为函数重载和模板,在编译期根据参数类型生成具体代码。本文重点讨论运行时多态(动态),即通过基类指针或引用调用虚函数,实际执行的是派生类的实现。
简单来说,多态允许同一个接口表现出不同的行为。比如买票这个行为,普通人全价,学生优惠,军人优先;再比如动物叫,猫对象传入输出喵,狗对象传入输出汪。这种'同一种操作,不同对象产生不同结果'的机制,就是运行时多态。
2. 多态的定义及实现
多态通常发生在继承体系下。要实现运行时多态,必须满足两个核心条件:
- 必须有继承关系:且通过基类的指针或引用来调用函数。
- 被调用的函数必须是虚函数:并且在派生类中完成了重写(Override)。
2.1 虚函数
虚函数是支持多态的基础。在类成员函数前加 virtual 修饰符,该函数即为虚函数。注意,非成员函数不能声明为虚函数。
class Person {
public:
virtual void BuyTicket() {
cout << "买票 - 全价" << endl;
}
};
2.2 虚函数的重写/覆盖
当派生类中存在一个与基类虚函数签名完全相同(返回值类型、函数名、参数列表一致)的函数时,称为重写了基类虚函数。即使派生类没有显式添加 virtual 关键字,只要继承了基类的虚函数并进行了重写,依然构成多态,但为了代码可读性,建议显式写出 virtual。
namespace twg {
class Person {
public:
virtual void BuyTicket() {
cout << "买票 - 全价" << endl;
}
};
class Student : public Person {
public:
virtual void BuyTicket() {
cout << "买票 - 打折" << endl;
}
};
class Animal {
public:
virtual {}
};
: Animal {
:
{
std::cout << << std::endl;
}
};
: Animal {
:
{
std::cout << << std::endl;
}
};
{
animal.();
}
}
{
twg::Cat cat;
twg::Dog dog;
twg::(cat);
twg::(dog);
;
}


