Scott Meyers (Effective C++) แนะนำ:
ถ้าคลาสมี virtual function ใดๆ ควรมี virtual destructor ด้วย และคลาสที่ไม่ได้ออกแบบมาเป็น base class หรือใช้ polymorphically ไม่ควรมี virtual destructor
เหตุผล: หากสร้าง object ด้วย derived constructor แต่ชี้ด้วย base pointer:
Base *b = new Derived(); delete b; // ถ้า Base::~Base() ไม่ใช่ virtual → UB!
ถ้า destructor ไม่ใช่ virtual: delete b เรียก Base destructor เท่านั้น Derived destructor ไม่ถูกเรียก → resource leak
Virtual destructor ทำให้ dynamic dispatch ทำงาน เรียก Derived destructor ก่อน แล้วค่อย Base destructor