是,取决于函数是否为虚函数:只有virtual函数才通过引用触发动态绑定,调用实际对象类型的实现;非虚函数编译期绑定,只看引用的静态类型。

引用类型调用方法时,是否执行派生类的实现,取决于该函数是否为虚函数。只有声明为 virtual 的函数,才能通过基类引用(或指针)触发动态绑定,最终调用实际对象所属类型的版本。
虚函数是动态绑定的前提
非虚函数在编译期就确定调用目标,只看引用的静态类型。比如:
- Base& ref = derived; 调用 ref.show(),若 show 不是虚函数,永远调用 Base::show
- 加上 virtual 后,同一行代码会跳转到 Derived::show,因为运行时通过对象内部的 vptr 找到其真实类的虚函数表(vtable)
引用和指针行为一致,但语义更安全
引用不能为空、不可重绑定,因此比指针更适合作为多态接口的参数或返回值:
- 函数形参用 const Base& 比 const Base* 更清晰地表达“必须传有效对象”
- 返回引用(如迭代器、流操作符)天然支持链式调用,且仍能保持多态性
- 底层机制相同:都是通过对象首地址读取隐藏的 vptr,再查 vtable 索引
override 关键字强化类型安全
在派生类中重写虚函数时,显式使用 override 能让编译器检查签名是否真正匹配基类虚函数:
- 防止因参数类型、const 修饰或返回值不一致导致意外变成新函数而非重写
- 避免因拼写错误(如 shwo)而静默创建非虚成员,破坏多态预期
- C++11 起推荐始终使用,不是可选语法糖,而是关键的契约声明
纯虚函数强制接口契约
当虚函数声明为 = 0,它就成为纯虚函数,所在类变为抽象类:
- 不能直接实例化,只能作为接口被继承
- 派生类若未实现所有纯虚函数,自身也自动成为抽象类
- 这确保了通过基类引用调用时,每个具体对象都提供了一致的行为实现











