특별히 추상클래스를 부모로 둘 필요가 없다 생각되고 각 다른타입으로 생성될 템플릿 클래스들이 자식으로 있을때
공통적으로 업캐스팅을 하고자 할때 다음처럼 사용
comment : 자식은 각 고유의 타입마다 다른 형태로 컴파일 타임에 인스턴스화 되어야 할때 사용
그외에도 목적에 맞게 사용하면 그만이지 뭐..
class objectBase_sjh{
public :
virtual ~objectBase_sjh(){};
virtual HRESULT renderGeoMatricalNormal(){ return S_OK; }; //템플릿이 아닌 클래스에서의 가상함수
};
template<typename T> //템플릿이 아닌 클래스 objectBase_sjh 를 상속받지만
class objectCommon_sjh : public objectBase_sjh{ //objectCommon_sjh 클래스는 템플릿 클래스
protected:
typedef std::vector<TEXTUREINFO_SJH> vecTextureInfo_sjh;
objectCommon_sjh(){}
public :
//부모에서 정의한 virtual 을 따로 정의해줄 필요는 없다, 필요하다면 재정의
};
template<typename T>
class xFileObject_sjh : public objectCommon_sjh<T>{
public :
T _data;
public :
xFileObject_sjh(){
_data=60;
}
~xFileObject_sjh(){}
explicit xFileObject_sjh( LPDIRECT3DDEVICE9 pD3dDevice,
std::wstring xFileName=_T(""),
std::wstring textureName=_T(""),
const std::wstring& directoryPath=_T("images/") )
{
}
public :
virtual HRESULT renderGeoMatricalNormal(){ std::cout<<"xFileObject_sjh\t"<<_data<<std::endl; return S_OK; } //xFileObject_sjh 60 가 출력된다
};
//////////////////////////////////////////////////////////////////////////
template<typename T> //objectCommon_sjh 과는 다른 용도로 사용될 동일한 objectBase_sjh 를 상속받는
class objectOther_sjh : public objectBase_sjh{ //템플릿클래스
protected:
typedef std::vector<TEXTUREINFO_SJH> vecTextureInfo_sjh;
objectOther_sjh(){}
public :
};
template<typename T>
class renderObject_sjh : public objectOther_sjh<T>{
public :
T _data;
public :
renderObject_sjh(){
_data=30.5;
}
~renderObject_sjh(){}
explicit renderObject_sjh( LPDIRECT3DDEVICE9 pD3dDevice,
std::wstring xFileName=_T(""),
std::wstring textureName=_T(""),
const std::wstring& directoryPath=_T("images/") )
{
}
public :
virtual HRESULT renderGeoMatricalNormal(){ std::cout<<"renderObject_sjh\t"<<_data<<std::endl; return S_OK; } //renderObject_sjh 30.5 가 출력된다
};
int main()
{
objectBase_sjh* instance1=new xFileObject_sjh<int>;
instance1->renderGeoMatricalNormal();
objectBase_sjh* instance2=new renderObject_sjh<float>;
instance2->renderGeoMatricalNormal();
getchar();
delete instance2;
delete instance1;
return 0;
}