template<typename T>
class MySwither{
public:
    virtual void SetData(T data) = 0;
    virtual T GetData() = 0;
    virtual ~MySwither() {}
};

class AthleteForm : public MySwither<int> {
private:
    int a;
public:
    AthleteForm() : a(0){}
    void SetData(int data){
        a = data;
    }
    int GetData(){
        return a;
    }
};

template<typename T>
class AbsObj{
public:
    AbsObj(){}
    MySwither<T> *obj;
};


class IntObj : public AbsObj<int>{
public:
    IntObj(){
        obj = new AthleteForm;
    }
    ~IntObj(){
        if(obj != nullptr){
            delete obj;
        }
    }
};

int main(int argc, char *argv[])
{
    IntObj obj;
    return 0;
}