Home > Enterprise >  Implicitly declared destructor
Implicitly declared destructor

Time:09-28

If I'm correct, a default destructor is always implicitly declared, unless the user declares it. According to cppreference:

Deleting an object through pointer to base invokes undefined behavior unless the destructor in the base class is virtual

Now, consider this example:

struct B {};
struct D : B {};

Is the implicitly declared destructor B::~B() virtual? If not, should I always declare a virtual destructor when using inheritance?

CodePudding user response:

Is the implicitly declared destructor B::~B() virtual?

No, as per class.dtor/3:

An implicitly-declared prospective destructor for a class X will have the form

~X()

and, naturally, as per class.dtor/12:

If a class has a base class with a virtual destructor, its destructor (whether user- or implicitly-declared) is virtual


If not, should I always declare a virtual destructor when using inheritance?

The C Core Guidelines, C.35 advices to make base class destructors that are public to be virtual:

C.35: A base class destructor should be either public and virtual, or protected and non-virtual

Reason To prevent undefined behavior. If the destructor is public, then calling code can attempt to destroy a derived class object through a base class pointer, and the result is undefined if the base class’s destructor is non-virtual. If the destructor is protected, then calling code cannot destroy through a base class pointer and the destructor does not need to be virtual; it does need to be protected, not private, so that derived destructors can invoke it. In general, the writer of a base class does not know the appropriate action to be done upon destruction.

[...]

Note A virtual function defines an interface to derived classes that can be used without looking at the derived classes. If the interface allows destroying, it should be safe to do so.

[...]

Exception We can imagine one case where you could want a protected virtual destructor: When an object of a derived type (and only of such a type) should be allowed to destroy another object (not itself) through a pointer to base. We haven’t seen such a case in practice, though.

Enforcement

  • A class with any virtual functions should have a destructor that is either public and virtual or else protected and non-virtual.
  • Related