C++ 多态核心解析:虚函数、虚表与动态绑定机制
多态通常分为两类:编译时的静态多态和运行时的动态多态。前者如重载和模板,后者则是本文重点。
简单来说,运行时多态允许同一接口在不同对象上表现出不同行为。比如购票场景:普通人全价,学生优惠,军人优先。同样是一个 talk() 函数,传入猫对象输出喵叫,传入狗对象则输出汪汪。
多态的定义及实现
多态是在继承关系下,基类指针或引用调用同一个函数,却产生了不同的行为。例如 Student 继承自 Person,通过基类指针调用买票函数时,实际执行的是派生类的逻辑。
要实现多态,必须满足两个条件:
- 必须是基类的指针或者引用调用虚函数。
- 被调用的函数必须是虚函数,并且完成了重写(Override)。
虚函数
在类成员函数前加 virtual 修饰,该函数即为虚函数。非成员函数不能加此修饰符。
class Person {
public:
virtual void BuyTicket() {
std::cout << "买票 - 全价" << std::endl;
}
};
虚函数的重写/覆盖
当派生类中存在一个与基类虚函数签名完全相同(返回值、函数名、参数列表一致)的函数时,称为重写了基类虚函数。即使派生类未显式添加 virtual 关键字,只要继承了基类虚函数,依然构成重写,但建议显式声明以保持规范。
namespace twg {
class Person {
public:
virtual void BuyTicket() {
std::cout << "买票 - 全价" << std::endl;
}
};
class Student : public Person {
public:
virtual void BuyTicket() {
std::cout << "买票 - 打折" << std::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);
;
}


