Khi class có ít nhất 1 virtual function, compiler tạo một vtable — mảng các con trỏ hàm cho class đó.
Mỗi object có thêm một hidden pointer (vptr) trỏ tới vtable của class thực sự.
Shape vtable: [ draw → Shape::draw, area → 0 (pure) ]
Circle vtable: [ draw → Shape::draw, area → Circle::area ]Khi gọi s->area() (s là Shape* trỏ Circle): đọc vptr → tra vtable → gọi Circle::area. Toàn bộ quá trình trong 1 indirect call.
Chi phí: thêm 1 pointer (~8 bytes) mỗi object + 1 indirect function call. Trong phần lớn ứng dụng, chi phí này không đáng kể.
Lý do phải khai báo virtual destructor: nếu không, khi delete shape_ptr compiler chỉ gọi Shape::~Shape bỏ qua Circle::~Circle → undefined behavior (biểu hiện thường là memory leak hoặc resource không được giải phóng).