#include "iostream.h"
class DestructionStatusReceiver 
{
public:
    DestructionStatusReceiver ( ) : m_destructionHasProblem (0) { } 
    virtual void DestructionBad ( ) { m_destructionHasProblem = 1 ; }
    virtual ~DestructionStatusReceiver ( ) { }
protected:
    int m_destructionHasProblem ;
} ;

class A ;
class B : public DestructionStatusReceiver
{

public: 
    //B class may choose to override virtual DestructionBad ( ) 
    B ( )  ;
    ~B ( )  ;
    A * m_ptrA ;


} ;
class A
{
    public:
    
    A ( DestructionStatusReceiver *ptrDSR ): m_ptrDSR ( ptrDSR ) { } 
    ~A ( )  ;
    DestructionStatusReceiver * m_ptrDSR ;
} ;

A::~A ( ) 
{ 
    cout << "~A" << endl ; 
    m_ptrDSR->DestructionBad ( ) ; //to notifiy that A destruction encouters 
                                   //something bad.
}


B::B ( ) : DestructionStatusReceiver ( )
{ 
    m_ptrA = new A ( this ) ; 
} 


B::~B ( ) 
{ 
    cout << "~B" << endl ;
    delete m_ptrA ;
    if ( m_destructionHasProblem == 1 ) 
    {

        cout << "destruction of A data member encountered problem!" << endl ;
    }
} 

int main ( void ) 
{
    B * ptrB = new B  ;
    delete ptrB ;
/*
putput:
~B
~A
destruction of A data member encountered problem!
*/
}
Hosted by www.Geocities.ws

1