template class Base { public: Base(T x) : x_(x) { }; Derived half() { Derived d(x_ / 2); return d; }; virtual T calculate() = 0; virtual ~Base() { }; protected: T x_; }; template class Square : public Base > { public: Square(T x) : Base >(x) { }; T calculate() { return this->x_ * this->x_; } }; template class Cube : public Base > { public: Cube(T x) : Base >(x) { }; T calculate() { return this->x_ * this->x_ * this->x_; } };