স্কট মেয়ার্স (Effective C++) বলে: যদি ক্লাসে কোনো ভার্চুয়াল ফাংশন থাকে, তবে ডিস্ট্রাক্টরও ভার্চুয়াল হতে হবে। আর যেসব ক্লাস বেস ক্লাস হিসেবে ডিজাইন করা নয় বা পলিমরফিক্যালি ব্যবহার করা নয়, সেগুলোতে ভার্চুয়াল ডিস্ট্রাক্টর দরকার নেই।
কারণ
Base *b = new Derived(); delete b; // যদি Base::~Base() virtual না হয়, তবেই Undefined Behaviour!
যদি বেস ক্লাসের ডিস্ট্রাক্টর ভার্চুয়াল না হয়, তবে delete b শুধু Base::~Base() কল করবে, Derived::~Derived() কল করবে না। ফলাফল: ডেরাইভড ক্লাসের রিসোর্স মুক্ত হবে না (মেমরি লিক, ফাইল হ্যান্ডল লিক ইত্যাদি)।
সঠিক প্যাটার্ন
class Base {
public:
virtual ~Base() = default; // ভার্চুয়াল ডিস্ট্রাক্টর
virtual void foo() = 0;
};
class Derived : public Base {
// ...
~Derived() override { /* cleanup */ }
};
নোট: C++11-এ = default ব্যবহার করে এক্সপ্লিসিটলি ডিফল্ট ভার্চুয়াল ডিস্ট্রাক্টর দেওয়া যায়।