虚函数与多态 · 同一个调用,不同的实现

基类指针 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 —— 没有多态