Not every call of a virtual function is resolved dynamically. In fact, in many cases the compiler resolves the call statically, even if the function is declared virtual. For example:
class A { public: virtual void func() {/*..*/} }; int main() { A a; A.func(); // resolved at compile time }
Dynamic binding applies in two cases: when calling a virtual function through a pointer to a polymorphic object, and when calling a virtual function through a reference to a polymorphic object (a polymorphic object is one that declares or inherits at least one virtual member function). For example.:
void f(A & ref, A* pa) { ref.func(); // resolved dynamically pa->func(); // resolved dynamically } int main() { A a; f(a, &a); }
You can bypass the dynamic binding mechanism by using explicit qualification with the scope operator:
pa->A::func(); // resolved statically