/*****************************************************************
Name : 
Date : 2017/05/12
By   : CharlotteHonG
Final: 2017/05/12
*****************************************************************/
#include <iostream>
using namespace std;

template <class T> 
struct Base{
    Base(int i=0): num(i){}
    void interface(){
        static_cast<T*>(this)->implementation();
    }
    // static void static_func(){
    //     T::static_sub_func();
    // }
    int num;
};

struct Derived : Base<Derived>{
    Derived(int i=0):Base<Derived>(i){}
    void implementation(){
        cout << "num=" << num << endl;
    }
    // static void static_sub_func();
};

int main(int argc, char const *argv[]){
    Base<Derived>* p = new Derived(10);
    p->interface();
    return 0;
}