#include #include class A { public: ~A() { printf("~A\n"); } }; class B : public A { public: ~B() { printf("~B\n"); } }; class BaseDestructor { public: virtual ~BaseDestructor() {}; }; template class Destructor : public BaseDestructor { private: Y *obj; public: Destructor() : obj(NULL) {}; Destructor(Y *obj_) : obj(obj_) {}; ~Destructor() { delete obj; }; }; template class X { public: X() {} template X(Y *p) { d = new Destructor(p); } ~X() { delete d; } private: BaseDestructor *d; }; template 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 *x1 = new X(b1); Z *x2 = new Z(b2); printf("Template constructor\n"); delete x1; printf("Regular constructor\n"); delete x2; return 0; }