How & When to Use C++’s Virtual Destructor?


how to use c++ virtual destructor

*This post may contain affiliate links. As an Amazon Associate we earn from qualifying purchases.

Do?destructors always get called for every object, or do we need to make them virtual? What?is a virtual destructor anyway? We will try to answer these (and more) questions in this step by step guide to virtual destructors ?and pure virtual destructors in C++.

What is a Virtual Destructor?

A destructor function is the inverse of a constructor function. Destructors are used when clean-up is necessary due to an object coming to an end since C++ does not have garbage collection like other languages such as Java. This destructor will call derived classes before the base class, whereas non-virtual destuctors will only delete base class objects.

What is a Pure Virtual Destructor?

Pure virtual destructors are used with abstract classes. Since every abstract class needs a pure virtual function, some programmers like to make the destructor pure virtual as a reminder that the class is abstract. In some cases, it is preferable to use pure virtual destructors rather than just a virtual one?when no virtual calls are necessary.

How to Use a Virtual Destructor?

C++ uses ~ to define destructors. Making a destructor virtual is relatively simple. For example:

class MyBase
{
public:
MyBase()
{
printf(“\nConstructor\n”);
}
~virtual MyBase()
{
printf(“\nDestructor\n”);
}
};

Since C++ doesn’t have garbage collection, you need to manually delete all objects you created with new. For example:

MyClass::~class1(void)
{
delete object1;
delete object2;
}

Conclusion

When deleting an instance of an object, if we delete it through a base pointer without virtual destructors, the base class destructor will be called, which can cause memory leaks. Some programmers argue that if a class has any virtual function, it needs a virtual destructor, but here is a better rule of thumb. According to Sutter,”A base class destructor should be either public and virtual, or protected and nonvirtual.”

Recent Posts