虚函数与多态 · 同一个调用,不同的实现
基类指针 Animal* 调用 virtual 函数时,按对象的实际类型在运行时动态绑定到派生类版本
基类指针(一个变量)
指向的对象(实际类型)
p->speak() 的输出
Animal* p
存的是「某个对象的地址」
struct Animal{ virtual speak(); };
Dog:Animal speak(){ "Woof" }
Cat:Animal speak(){ "Meow" }
Dog
对象
vptr ─▶ Dog::speak
实际类型 = Dog
Cat
对象
vptr ─▶ Cat::speak
实际类型 = Cat
运行时查 vptr
Woof
Animal* p
= &dog;
p->speak();
// 调用点一字未改
同一行 p->speak():对象是 Dog 就喊 Woof,是 Cat 就喊 Meow —— 这就是多态
若 speak() 不是 virtual:编译期按指针的静态类型 Animal 绑定,两次都只喊 Animal —— 没有多态
▶ 重播