#include <cstdio>
#include <typeinfo>

class A {
	public:
		~A() { printf("~A\n"); }
};

class B : public A {
	public:
		~B() { printf("~B\n"); }
};

class BaseDestructor {
	public:
		virtual ~BaseDestructor() {};
};

template <class Y>
class Destructor : public BaseDestructor {
	private:
		Y *obj;
	public:
		Destructor() : obj(NULL) {};
		Destructor(Y *obj_) : obj(obj_) {};
		~Destructor() { delete obj; };
};

template<class T>
class X {
	public:
		X() {}


		template <class Y>
		X(Y *p) {
			d = new Destructor<Y>(p);
		}

		~X() {
			delete d;
		}

	private:
		BaseDestructor *d;

};

template<class T>
class Z {
	public:
		Z() {}

		Z(T *p_) : p(p_) {}
		~Z() { delete p; }
	private:
		T* p;
};

int main() {
	B *b1 = new B;
	B *b2 = new B;

	X<A> *x1 = new X<A>(b1);
	Z<A> *x2 = new Z<A>(b2);

	printf("Template constructor\n");
	delete x1;
	printf("Regular constructor\n");
	delete x2;

	return 0;
}

