多态的核心概念
多态(Polymorphism)通俗讲就是'多种形态'。在 C++ 中,它主要分为编译时多态(静态多态)和运行时多态(动态多态)。
编译时多态主要依赖函数重载和模板,编译器根据参数类型在编译期决定调用哪个函数。而运行时多态才是我们重点讨论的,它允许通过基类指针或引用调用虚函数,实际执行的是派生类的版本。
举个例子,同样是'买票'这个行为:普通人全价,学生打折,军人优先。再比如动物叫,猫对象传入输出喵,狗对象传入输出汪。这种'同一种接口,不同实现'的特性,就是多态的魅力所在。


实现多态的关键条件
要实现运行时多态,必须满足以下三个核心条件:
- 继承关系:必须是基类和派生类的对象。
- 虚函数重写:派生类必须重写基类的虚函数。
- 指针或引用调用:必须通过基类的指针或引用来调用该函数。
如果直接用对象调用,或者没有使用虚函数,多态效果就会失效。
虚函数的定义与规则
在成员函数前加 virtual 关键字,该函数即成为虚函数。注意非成员函数不能声明为虚函数。
#include <iostream>
using namespace std;
class Person {
public:
virtual void BuyTicket() {
cout << "买票 - 全价" << endl;
}
};
虚函数的重写(Override)
当派生类中存在一个与基类虚函数签名完全相同(返回值、函数名、参数列表一致)的函数时,称为重写。虽然派生类中可以不写 virtual 关键字(因为继承了基类的虚属性),但为了代码清晰和规范,建议显式加上。
这里有个常见的误区:很多人以为父类去掉 virtual 不影响子类,其实不然。如果基类函数不是虚函数,派生类同名函数只是隐藏(Hide)而非重写,无法触发多态。
#include <iostream>
using namespace std;
{
:
{
cout << << endl;
}
};
: Person {
:
{
cout << << endl;
}
};
{
ptr->();
}
{
Person ps;
Student st;
(&ps);
(&st);
;
}




