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