카테고리 없음

7월 25일. 상속, 템플릿

IT_johny 2018. 7. 25. 14:28

상속.

CParent 부모


CChild : public CParent

CChild : proteced CParent

CChild : private CParent


외부접근에서만 바뀐다. 내부에서는 부모의 멤버가 public protected면 무조건 접근가능.


만약 CChild가 public으로 CParent를 상속받으면 CParent에서 받아온 public 멤버들은 외부에서 접근 가능


하지만 상속을 2중이상 할 경우 접근제어에 영향을 받는다.

(CParent의 모든 멤버에 CChild: private CParent후 CCChild : (public || protected || private) CChild의 경우 할아버지의 모든 멤버 근 불가능)


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


CParent* pParent = new CChild; (업캐스팅)

의 경우


CChild* pChild = (CChild*)pParent; (다운캐스팅)

CChild1* pChild1 = (CChild1*)pParent; (다운캐스팅)


오류날 수 있다. pParent는 CChild를 캐스팅 받았는데 CChild1과 CChild의 할당 크기가 다를 수 있으므로.


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


가상함수 virtual. 

부모에 가상함수를 선언하면 가상함수 테이블 생성. 자식에서 해당 함수를 재정의 해준 후 호출시에 테이블을 참고해서 가져온다.


부모 클래스의 소멸자는 항상 가상 소멸자로 선언해준다.

 => 소멸자 호출 후 가상 함수 테이블을 참고하여 부모의 소멸자까지 호출해줌.


순수 가상함수

 virtual void PPPPPPPPP() = 0;

 순수 가상 함수는 구현부가 존재하지 않는다. 

 순수 가상 함수를 가지는 클래스를 추상 클래스라고 한다.

 추상 클래스는 객체(인스턴스) 생성이 불가능하다.

 순수 가상함수는 자식에서 반드시 재정의 해야한다. 

 왜냐하면 순수 가상함수는 정의부분이 없기 때문에 반드시 자식에서 재정의해서 사용할 목적으로

 만들어주는 함수이기 때문.


템플릿

컴파일 단계에서 타입을 결정짓는 기능.

template <typename 원하는이름>

template <class 원하는이름>


 ex) template <typename T>

void Output(){

cout << typeid(T).name() << endl;

}

사용시 Output<int>();

Output<float>();

Output<CStudent>();

Output<_tagStudent>();

결과 : int

   float

   class CStudent

   struct tagStudent


인라인 함수

인라인함수는 매크로(#define)와 비슷함

헤더파일에서 함수 몸체까지 넣으면 컴파일러가 자동으로 인라인 처리하는데 줄 수가 길어지면 컴파일러가 자동으로 인라인x 시킴.

장점 : 스택에서 호출하지않고 실행. 단점 : 파일 크기가 커진다. (호출시에 코드를 직접가져와서 삽입되어 컴파일되기 때문)


Iterator

반복자. 자료구조의 처음부터 끝까지 순차적으로 탐색.


Friend

친구로 만들어 준다.

friend class CLinkedList; 

==> CLinkedList의 private와 protected 접근 가능해진다. 단, 템플릿 클래스의 경우 template <typename T>를 해주어야 함.


unsigned int size() const

멤버 함수뒤에 const를 붙여주면 함수 내에서 멤버 변수의 값을 변경할 수 없다.