#include <iostream.h>

class B {
public:
  ~B() { cout << "\t~B " << (void*)this << endl; }
};

class D : public B {
public:
  ~D() { cout << "\t~D " << (void*)this << endl; }
};

class D2 : public B {
};

class Bv {
public:
  virtual ~Bv() { cout << "\t~Bv " << (void*)this << endl; }
};

class Bv2 : public Bv {
};

class Dv : public Bv {
public:
  virtual ~Dv() { cout << "\t~Dv " << (void*)this << endl; }
};


int main() {
  {
    cout << "D case::" << endl;
    D d;
  }
  {
    cout << "D2 case, default DTOR::" << endl;
    D2 d2;
  }
  {
    cout << "D with virtual case::" << endl;
    Dv dv;
  }
  {
    cout << "B2 case, default DTOR::" << endl;
    Bv2 bv2;
  }
  {
    cout << "Dv via b-ptr case::" << endl;
    Bv *bv = new Dv();
    delete bv;  // virtual magic
  }
  return 0;
}


