#include <iostream>

using std::cout;
using std::endl;

//non-virtual dtors
struct Bar {
protected:
  void *x;
  ~Bar() { cout << "in Bar dtor: " << x << endl; }
public:
  Bar(void *x) : x(x) { cout << "in Bar ctor: " << x << endl; }
};

struct Baz : public Bar {
  Baz(void *x) : Bar(x) { cout << "in Baz ctor: " << x << endl; }
protected:
  ~Baz() { cout << "in Baz dtor" << x << endl; }
};

struct Dummy {
  int d;
  void dummy() { cout << "dummy: d" << endl; }
};

template <class Base>
struct Foo : public Dummy, public Base
{
  Foo(void *z) : Base(z) {}
};

typedef Foo<Bar> Foor;
typedef Foo<Baz> Fooz;

int main(int a, char** b)
{
  Foor* fr = new Foor((void*)123);
  Fooz* fz = new Fooz((void*)456);

  fr->dummy();
  fz->dummy();

  delete fr;
  
  fr = (Foor*)fz;
  delete fr;

  cout << "after delete" << endl;

  return 0;
}

