Khi xóa object dẫn xuất qua con trỏ lớp cơ sở:
cpp
Base* p = new Derived();
delete p; // destructor nào chạy?Nếu destructor của Base không virtual, chỉ ~Base() chạy — phần Derived không được hủy → rò rỉ tài nguyên / undefined behavior.
Đánh dấu virtual ~Base() để delete tra vtable và gọi đúng ~Derived(), hủy đầy đủ chuỗi từ dẫn xuất về cơ sở.
Quy tắc (Effective C++, Item 7): lớp dùng làm base đa hình (có bất kỳ virtual function nào) phải có virtual destructor. Ngược lại, lớp không định dùng làm base thì đừng thêm — tránh chi phí vptr.