반응형

간단한 소스를 예로 들겠습니다...


template<typename object>

class Sequence : public List<object>

{

public:

생략

}


이런 소스입니다.


여기서


class Sequence : public List<object>

 

를 모르겠습니다. 상속인 것은 알겠습니다.  List라는 클래스를 상속 받은 것 까지도


알겠는데, 뒤에 <object>가 붙은 걸 모르겠습니다.


template선언에 의해서 template형 변수를 가진 클래스를 상속받는다라고 하시는 분을


봤지만, 이해가 가지 않는 것은,


List라는 클래스를 정의를 할 때, 이미 데이터 맴버를 template으로 정의를 하고,


그걸 상속 받으면 어차피


template 타입의 데이터맴버를 갖는 클래스를 상속 받는것 아닌가요?


굳이 저렇게 써 줘야 하는 이유를 모르겠습니다.


만드시 저렇게 써야 하나요?


그리고 저게 만약에 template 타입의 데이터 맴버를 갖는 클래스를 상속 받는거라고 한다


면 List에 어떻게 정의 되어 있는 데이터 맴버가 template가 되는건가요?


그 안에서 template으로 정의 된 것들인가요?


이 것도 예를 들겠습니다.


template <typename A>

class List{

private:

   A size;

  int lone;

 char stst;

}


이렇게 정의되어 있다고 한다면


size 변수가 template이 되어 상속 받는건가요?


그럼 굳이 다시 sequence class 정의에서 상속시 <object>를 해 줄 필요가 없지 않나요?


두가지에 대해서 질문드립니다~.


----------------------------------------------------------------------------------------

윗분께는 죄송하지만 템플릿은 컴파일 타임에 타입이 결정됩니다.


템플릿은 전달인자라고 생각하시면 의외로 쉽습니다.


다만 변수가 아니라 타입을 전달하는 것이지요.

 

Sequence<int> sqns;


template< typename object >

class Sequence : public List<object>

{

   object var;

};


object는 이제부터 int 입니다.

var변수는 int var; 이 되는것이지요.


List가 부모클래스 이므로 부모클래스가 생성되야 자식클래스(Sequence)가 생성되죠.


List도 템플릿 클래스라 템플릿 인자를 넘겨줘야 List클래스가 생성됩니다.


아까 전달받은 object...즉 int를 넘겨줍니다.


template < typename A >

class List{

private:

   A size;

  int lone;

 char stst;

}


이제 size변수는 int size; 입니다.


이상태로 인스턴스화 되는것이지요.

 

class Sequence : public List

{

};


class List{

private:

  int size;

  int lone;

 char stst;

}


이렇게 해서


Sequence sqns;


해서 생성한 것이나


아까 템플릿 버젼의


Sequence< int > sqns;


나 똑같습니다.


다만 템플릿 버젼은 double나 char형도 만들수 있겠죠.


템플릿 타입이라는건 컴파일 전에 타입을 알려줘야 컴파일이 되는 아주 강력한 타입검사 시스템 입니다. 


한마디로


template < typename A >

class List{

private:

   A size;

  int lone;

 char stst;

}


에서 size변수는 컴파일이 시작되기전에 타입이 무엇인지 알아야 컴파일이 될수 있다는 것이지요.


만약

 template< typename object >

class Sequence : public List

{

};


이렇게 되었다고 한다면 List의 size변수는 어떠한 타입이여야 할까요?

그걸 결정해 주지 않는한 컴파일러는 발악하며 컴파일을 거부합니다.



상속과 템플릿을 동시에 보시니까 헤깔리시는것 같네요.

조금더 보시면 이해 되실겁니다.

----------------------------------------------------------------------------------------

안녕하세요.... 답변드릴게요


template

class List{

private:

   A size;

  int lone;

 char stst;

}

이놈을 상속받는데요...


template이 간단히말씀드리면, 컴파일 할때는 template에서 쓸 타입(A)가 결정나는게

아닙니다.


 런타임시간에.... 타입이 결정나서 그렇구요.


LIST< int> a;


Sequence <double> c;

이케되면...... 타입이 같은 타입이 아닐경우 문제가 있죠^^*

그래서 list< object> 이케 해줘야하는거죠^^*


음 이해가되시는지 잘모르겟내요^^*

반응형
Posted by Real_G