动态分派是一种运行时机制,它根据对象的实际类型而非变量的声明类型来决定执行哪个方法实现。大多数基于类的语言通过**虚方法表(vtable)**来实现它。
虚表模型
每个类都有一个包含其方法实现指针的表。每个对象持有一个指向其类的虚表的隐藏指针。一个虚调用变成:在对象的虚表中查找该方法,然后跳转到那里。
text
Animal a = new Dog();
a.speak();
a ──▶ Dog object ──▶ [Dog vtable]
speak() ──▶ Dog.speak() ← chosen at RUNTIME
编译器不会硬编码 Animal.speak;它生成的代码是"调用该对象指向的虚表中的第 N 个槽"。
