静态绑定(早绑定,编译时):
void greet() { std::cout << "Hello!"; }
动态绑定(晚绑定,运行时):
class Animal { public: virtual void speak() { std::cout << "Animal"; } }; class Dog : public Animal { public: void speak() override { std::cout << "Woof"; } }; void foo(Animal* a) { a->speak(); } // 动态绑定
何时使用:
使用关键字 override 会加速虚拟函数的调用吗?
回答:
不,关键字 override 仅用于明确告知编译器该函数应重写虚拟基类函数。不会影响性能或函数调用方式。
class A { public: virtual void func(); }; class B : public A { public: void func() override; // 用于编译器检查,但不改变调用速度 };
故事
在高负载的交易所库中,团队在大多数操作中使用了虚拟方法,即使不需要多态性。结果是系统的性能比预期要慢——主要瓶颈在于vtable查找。
故事
在扩展算法的项目中,工作人员使用了普通方法而不是虚拟方法。后来发现通过基指针传递对象时行为没有改变,导致错误的计算;错误只有通过重写接口才得以修复。
故事
在媒体文件分析项目中,开发人员混淆了静态方法和虚拟方法。一些不同格式的函数忘记声明为虚拟,也未在子类中重写,导致文件处理走了错误的路径,结果缓存错误。