Compile-time (static polymorphism): lời gọi được phân giải lúc biên dịch — qua function overloading, template, CRTP. Không tốn chi phí runtime và có thể inline, nhưng kiểu phải biết trước lúc biên dịch.
Runtime (dynamic polymorphism): phân giải lúc chạy qua virtual function + vtable. Cho phép xử lý object qua con trỏ/tham chiếu lớp cơ sở, nhưng thêm một lần gián tiếp (tra vptr) và thường không inline được.
cpp
template<class T> void f(T& x){ x.run(); } // static
base->run(); // dynamic (virtual)Chọn: template khi kiểu biết lúc biên dịch và cần tốc độ; virtual khi cần chọn hành vi lúc chạy.