devxlogo

The Order of Destructors’ Call

An object’s destructor invokes the destructors of its direct base classes and member objects. The invocation occurs in the reverse order of the construction of the subobjects. Note, however, that all destructors are called with their qualified name, ignoring any possible virtual overriding destructors in derived classes. For example:

   struct A  {    virtual ~A() { cout << "destroying A" << endl; }  };  struct B: public A  {    ~B() { cout << "destroying B" << endl;}   };  int main()  {    B b;  };

This program displays:

   destroying B  destroying A 

This is because the compiler inserts additional code into the user-defined destructor of class B. The augmented destructor looks like this:

   B::~B()   {      //user-written code    cout<<"destroying B"<A::~A();   // (1) destructor called with its qualified name  }

In other words, although the destructor of class A is virtual, the qualified call inserted into the destructor of B is resolved statically (a function call with a qualified name bypasses the virtual mechanism). Therefore, A's destructor is called rather than B's when the statement marked (1) is executed.

Charlie has over a decade of experience in website administration and technology management. As the site admin, he oversees all technical aspects of running a high-traffic online platform, ensuring optimal performance, security, and user experience.

See also  Seven Service Boundary Mistakes That Create Technical Debt

About Our Editorial Process

At DevX, we’re dedicated to tech entrepreneurship. Our team closely follows industry shifts, new products, AI breakthroughs, technology trends, and funding announcements. Articles undergo thorough editing to ensure accuracy and clarity, reflecting DevX’s style and supporting entrepreneurs in the tech sphere.

See our full editorial policy.