C++ 多态深度解析:虚函数、重写与底层原理
多态,简单来说,就是'同一接口,多种实现'。在 C++ 中,它主要分为编译时多态(静态多态)和运行时多态(动态多态)。
1. 多态的核心概念
静态多态主要体现为函数重载和函数模板。它们通过参数类型的不同匹配,在编译期就确定了具体调用哪个函数。之所以称为'静态',是因为这种绑定发生在编译阶段。
动态多态则依赖于继承体系。传入不同的派生类对象,执行相同的接口函数,却表现出不同的行为。例如,定义一个 Animal 的 speak() 函数,传入 Cat 对象输出'喵喵',传入 Dog 对象则输出'汪汪'。
2. 动态多态的实现条件
要实现动态多态,必须同时满足以下两个核心条件:
- 必须是基类的指针或引用调用虚函数:直接通过对象调用不会触发多态。
- 被调用的函数必须是虚函数,且完成了虚函数重写(Override):派生类必须提供与基类签名一致的虚函数实现。
2.1 虚函数的定义
在类成员函数前加上 virtual 关键字修饰,该函数即成为虚函数。注意,非成员函数(如全局函数或静态函数)不能声明为虚函数。
class Person {
public:
virtual void BuyTicket() {
std::cout << "买票全价" << std::endl;
}
};
2.2 虚函数的重写与覆盖
虚函数重写:派生类中存在一个与基类完全相同的虚函数(返回值类型、函数名、参数列表均相同)。
虚函数覆盖:在重写的基础上,如果派生类参数列表与基类不一致,通常不构成重写,而是形成隐藏关系(除非涉及协变返回类型等特殊情况)。
下面是一个典型的动态多态示例:
class Person {
public:
virtual void BuyTicket() {
std::cout << "买票全价" << std::endl;
}
};
class Student : public Person {
public:
virtual void BuyTicket() override {
std::cout << << std::endl;
}
};
{
people.();
}
{
Person Mike;
(Mike);
Student John;
(John);
;
}


