/*==========================================*/  
/*  VirtualBase.cpp                         */              
/*                                          */
/*  Show the importance of declaring a      */ 
/*  base destructor 'virtual'               */  
/*==========================================*/  

#include <iostream.h>

/*==========================================*/  

class Base
{
  public:
    Base()  { cout << "Base()"  << endl; }
    ~Base() { cout << "~Base()" << endl; }
};

/*==========================================*/  

class DerivedBase : public Base
{
  public:
    DerivedBase()   { cout << "DerivedBase"  << endl; }
    ~DerivedBase()  { cout << "~DerivedBase" << endl; }
};

/*==========================================*/  

class BaseVirtual
{
  public:
    BaseVirtual ()          { cout << "BaseVirtual()"  << endl; }
    virtual ~BaseVirtual () { cout << "~BaseVirtual()" << endl; }
};

/*==========================================*/  

class DerivedVirtual : public BaseVirtual
{
  public:
    DerivedVirtual ()   { cout << "DerivedVirtual()"  << endl; }
    ~DerivedVirtual ()  { cout << "~DerivedVirtual()" << endl; }
};

/*==========================================*/  

int main (void)
{
    cout << "Importance of declaring the base destructor 'virtual'"
         << endl;

    cout << endl
         << "See which constructors and destructors are called" << endl
         << "WITHOUT a virtual base destructor..." << endl
         << endl;

    // Note:  If pDB is of type DerivedBase, 
    //        then of course there is no problem...
    Base *pDB = new DerivedBase;
    delete pDB;

    cout << endl
         << "See which constructors and destructors are called" << endl
         << "WITH a virtual base destructor..." << endl
         << endl;

    BaseVirtual *pDV = new DerivedVirtual;
    delete pDV;

    cout << endl << "Fini" << endl << endl;

    return 0;
}

/*==========================================*/  

/* .... Output from the program...

Importance of declaring the base destructor 'virtual'

See which constructors and destructors are called
WITHOUT a virtual base destructor...

Base()
DerivedBase
~Base()

See which constructors and destructors are called
WITH a virtual base destructor...

BaseVirtual()
DerivedVirtual()
~DerivedVirtual()
~BaseVirtual()

Fini

end of output ..... */

