1 template<typename T, class Derived> 2 class Base { 3 public: Base(T x)4 Base(T x) : x_(x) { }; 5 half()6 Derived half() { 7 Derived d(x_ / 2); 8 return d; 9 }; 10 11 virtual T calculate() = 0; ~Base()12 virtual ~Base() { }; 13 14 protected: 15 T x_; 16 }; 17 18 19 template<typename T> 20 class Square : public Base<T, Square<T> > { 21 public: Square(T x)22 Square(T x) : Base<T, Square<T> >(x) { }; 23 calculate()24 T calculate() { return this->x_ * this->x_; } 25 }; 26 27 28 template<typename T> 29 class Cube : public Base<T, Cube<T> > { 30 public: Cube(T x)31 Cube(T x) : Base<T, Cube<T> >(x) { }; 32 calculate()33 T calculate() { return this->x_ * this->x_ * this->x_; } 34 }; 35