Search code examples
c++oopvirtual-destructorscope-resolution

Private Derived Destructor


When I am trying to delete the derived object polymorphically (that is: base class has public virtual destructor) why derived class private destructor is still being called? Why the scope resolution private is not working here.

class Base
{
protected:
    Base() { cout << "Base constructor.\n"; }
public:
    virtual ~Base() { cout << "Base destructor.\n"; }
};

class Derived :public Base
{
public:
    Derived() { cout << "Derived constructor.\n"; }
private:
   ~Derived() { cout << "Derived destructor.\n"; }
};

int main()
{
    Base *p = new Derived();
    delete p;
}

Output:

Base constructor.
Derived constructor.
Derived destructor.
Base destructor.

Solution

  • Because destructors are called in reversed order of constructors and virtual destructor will always be called.

    private has nothing to do if a virtual function is going to be called.

    As I pointed here out:

    Why would a virtual function be private?

    ISO C++ 1998 Standard onwards explicitly states:

    §10.3 [...] Access control (clause 11) is not considered in determining overriding.


    A bit philosophical offtopic:

    Going further this is what STL does for iostreams: Definition of Non-Virtual Interface, i.e. all public functions (with exception of destructors) are non-virtual and all virtual functions are either protected or private. Public functions call virtual protected or private ones. This gives a very clear entry point into the entire hierarchy.