// MT4Q3 #include template class C { public: C(const T& t=0) : t_(t) { std::cout << "\n C()"; } C(const C& c) : t_(c.t_) { std::cout << "\n C(c)"; } ~C() { std::cout << "\n ~C()"; } C& operator=(const C& c) { std::cout << "\n C::operator=(const C& c)"; if(this == &c) return *this; t_ = c.t_; return *this; } private: T t_; }; template class B { public: B() : c() { std::cout << "\n B()"; } B(const B& b) : c(b.c) { std::cout << "\n B(b)"; } virtual ~B() { std::cout << "\n ~B()"; } B& operator=(const B& b) { std::cout << "\n B::operator=(const B& b)"; if(this == &b) return *this; c = b.c; return *this; } private: C c; }; template class D : public B { public: D() { std::cout << "\n D()"; } D(const D& d) : B(d) { std::cout << "\n D(d)"; } ~D() { std::cout << "\n ~D();"; } D& operator=(const D& d) { std::cout << "\n D::operator=(const D& d)"; if(this == &d) return *this; B::operator=(d); return *this; } }; void main() { D d1, d2; D d3 = d2 = d1; std::cout << "\n\n"; }