C++多态通过虚函数实现,基类指针或引用调用派生类重写函数,运行时动态绑定;纯虚函数(=0)定义抽象类,析构函数需virtual以防资源泄漏。

多态在C++中主要通过虚函数(virtual)实现,核心是让基类指针或引用能调用派生类重写的函数,运行时决定具体执行哪个版本。
虚函数的基本写法
在基类中用 virtual 声明成员函数,派生类中用相同签名重新定义(可加 override 显式标注):
- 基类函数必须声明为 virtual,否则调用永远绑定到基类版本
- 派生类中不加 virtual 也能构成多态(继承虚属性),但建议加上或使用 override 提高可读性和安全性
- 虚函数必须是类的非静态成员函数,不能是友元、构造函数或内联函数(除非编译器允许隐式展开)
纯虚函数与抽象类
把虚函数赋值为 = 0 就变成纯虚函数,含纯虚函数的类叫抽象类,不能实例化:
- virtual void draw() = 0; 表示“所有派生类都必须实现 draw”
- 抽象类可定义普通成员、虚函数甚至带实现的纯虚函数(C++11起支持)
- 派生类只有全部实现纯虚函数后,才成为可实例化的具体类
析构函数要声明为 virtual
如果基类指针指向派生类对象,且要通过基类指针 delete 对象,基类析构函数必须是 virtual:
立即学习“C++免费学习笔记(深入)”;
- 否则只会调用基类析构函数,派生类部分资源无法释放(如内存泄漏、文件未关闭)
- 即使基类没有数据成员或资源,只要可能被多态删除,就应加 virtual ~Base() = default;
多态调用的前提条件
虚函数机制只在“通过指针或引用”调用时生效:
- Base* p = new Derived(); p->func(); → 调用 Derived::func()
- Base& r = derived_obj; r.func(); → 同样触发动态绑定
- Base b; b.func(); 或 Derived d; d.func(); → 静态绑定,不走虚表
基本上就这些。虚函数本质靠虚表(vtable)和虚指针(vptr)支撑,编译器自动管理,使用者只需关注声明和调用方式是否符合多态要求。










