多态的概念
多态分为编译时多态(静态)和运行时多态(动态)。编译时多态主要指函数重载和模板,在编译期根据参数类型生成不同实例。本篇我们专注于运行时多态(动态),这也是面试中的高频考点。
运行时多态的核心在于:同一个行为接口,传入不同的对象,执行结果不同。比如买票这个行为,普通人全价,学生优惠,军人优先。再比如动物叫,猫对象调用就是喵,狗对象调用就是汪。

多态的定义及实现
多态通常发生在继承体系下,基类指针或引用调用虚函数时,产生不同的行为。
要实现多态,必须满足两个条件:
- 必须是基类的指针或者引用调用。
- 被调用的函数必须是虚函数,且派生类完成了重写(Override)。
虚函数
在类成员函数前加 virtual 修饰,该函数即为虚函数。非成员函数不能加 virtual。
class Person {
public:
virtual void BuyTicket() {
cout << "买票 - 全价" << endl;
}
};
虚函数的重写
派生类中有一个跟基类完全相同的虚函数(返回值类型、函数名、参数列表完全相同),称为重写了基类虚函数。即使派生类没加 virtual,只要继承了基类的虚函数并同名同参,也构成重写,但为了代码清晰,建议加上。
namespace twg {
class Person {
public:
virtual void BuyTicket() {
cout << "买票 - 全价" << endl;
}
};
class Student : public Person {
public:
virtual void BuyTicket() {
cout << "买票 - 打折" << endl;
}
};
class Animal {
:
{}
};
: Animal {
:
{
std::cout << << std::endl;
}
};
: Animal {
:
{
std::cout << << std::endl;
}
};
{
animal.();
}
}
{
twg::Cat cat;
twg::Dog dog;
twg::(cat);
twg::(dog);
;
}



