Destructors

What bad can happen if one doesn't define a destructor in the base class as virtual?

Just virtual destructor

#include <iostream> class ProtectedDestructor { public: ProtectedDestructor() { std::cout << "[ProtectedDestructor] constructor" << std::endl; } virtual ~ProtectedDestructor() { std::cout << "[ProtectedDestructor] destructor" << std::endl; } }; class PleaseLetMeDelete : public ProtectedDestructor { public: PleaseLetMeDelete() { std::cout << "[PleaseLetMeDelete] constructor" << std::endl; } ~PleaseLetMeDelete() { std::cout << "[PleaseLetMeDelete] destructor" << std::endl; } }; int main(int argc, char const *argv[]) { ProtectedDestructor* obj = new PleaseLetMeDelete(); delete dynamic_cast<PleaseLetMeDelete*>(obj); // delete obj; return 0; }

Virtual and Protected destructor

#include <iostream> class ProtectedDestructor { public: ProtectedDestructor() { std::cout << "[ProtectedDestructor] constructor" << std::endl; } protected: virtual ~ProtectedDestructor() { std::cout << "[ProtectedDestructor] destructor" << std::endl; } }; int main(int argc, char const *argv[]) { const ProtectedDestructor* obj = new ProtectedDestructor(); // delete dynamic_cast<PleaseLetMeDelete*>(obj); // delete obj; // error: destructor is inaccessible return 0; }