15. 클래스계통

Views:
 
Category: Entertainment
     
 

Presentation Description

CPP SIG 7주차 15장. 클래스 계통입니다.

Comments

Presentation Transcript

13년 상반기 SIG CPP :

13 년 상반기 SIG CPP C 팀 조희연 이선 우 copyright@ 2013 all rights reserved by swssm

15 클래스계통:

15 클래스계통 여러 개의 기본 클래스들의 관계망으로부터 만들어지며 , 클래스들 간의 상속관계 를 말한다 .

1. 다중상속 :

1. 다중상속 두 개 이상의 클래스 를 직접 기본 클래스로 사용하는 것 Satellite Task Displayed

1. 다중상속 – 모호성 문제! :

1. 다중상속 – 모호성 문제 ! 같은 이름의 함수로 인한 충돌 Satellite Task Displayed Virtual de b ug_info * get debug(); Virtual debug_info * get debug(); CALL get_debug () Task? Displayed?

1. 다중상속 – 모호성 문제 해결:

1. 다중상속 – 모호성 문제 해 결 같은 이름의 함수로 인한 충돌 해결 방법 1) 어떤 클래스의 것인지 명시 2) 파생 클래스에 멤버 함수를 새로 생성 (GOOD) 1 2

1. 다중상속 – 모호성 문제!2:

1. 다중상속 – 모호성 문제 !2 오버로딩 모호성 우연이 아닌 설계자에 의해 오버로딩 되었을 때 .. 인자에 따라 원하는 함수를 호출하고 싶다 ! Using 선언 사용 !

1. 다중상속 – 모호성 문제2 해결:

1. 다중상속 – 모호성 문제 2 해결 Using 선언 사용시 , 기본 클래스의 함수를 파생 클래스로 끌어와 파생 클래스 안에 오버로딩 된 함수 집합 구성 가능

1. 다중상속 – 가상기본 클래스 :

1. 다중상속 – 가상기본 클래스 모든 파생 객체들이 하나의 기본 클래스를 공유 할 수 있도록 한다 . 모호성 해결 메모리 낭비 방 지

1. 다중상속 – 가상기본 클래스 :

1. 다중상속 – 가상기본 클래스 A A B C D A B C D

1. 다중상속 – 사용 이유? :

1. 다중상속 – 사용 이유 ? 추상 클래스에 대해 구현 세부사항을 제공 하기 위해 다중상속을 사용 인터페이스 클래스 ( 추상 클래스 ) 구현 클래스 ( 실체 클래스 ) 정보 공유 클래 스 Class 마름모꼴 상속 유일한 공통 기본 클래스에 대한 의존성을 프로그램에 도입하지 않고도 형제 클래스 사이의 정보 공유 가능 다중 클래스의 근본 목적 파생 클래스가 인터페이스 클래스 및 구현 클래스로부터 물려받은 가상 함수를 오버라이드 하도록 구성되어 있다 .

1. 다중상속 – 가상기본클래스의 가상함수 오버라이드 :

1. 다중상속 – 가상기본클래스의 가상함수 오버라이드 가상 기본 클래스의 여러 가지 가상 함수 들을 오버라이드 할 수 있는 파생클래스는 두 개 이상 이 되어도 상관없다 . 똑같은 함수 를 다른 파생클래스들이 오버라이드는 안됨 오버라이드 하려면 !? 오버라이드하는 클래스의 모든 뿌리 ( 기본 클래스 ) 들 역시 그 함수를 오버라이드 하고 있어야 한다 .

1. 다중상속 – 가상기본클래스의 가상함수 오버라이드 :

1. 다중상속 – 가상기본클래스의 가상함수 오버라이드 Window Set color() Prompt() Window_with _ border Set color () Window_with _ menu Prompt() My_window

1. 다중상속 – 가상기본클래스의 가상함수 오버라이드 :

1. 다중상속 – 가상기본클래스의 가상함수 오버라이드 Window Set color() Prompt() Window_with _ border P rompt() Window_with _ menu Prompt() My_window error

1. 다중상속 – 가상기본클래스의 가상함수 오버라이드 :

1. 다중상속 – 가상기본클래스의 가상함수 오버라이드 Window Set color() Prompt() Window_with _ border P rompt() Window_with _ menu Prompt() My_window Prompt () OK

2. 접근제어 – 클래스 접근 :

2. 접근제어 – 클래스 접근 Public Protected private 일반 사용자 파생 클래스의 멤버 함수 및 프렌드 자기 자신의 멤버 함수 및 프렌드

2. 접근제어 – 기본 클래스에 대한 접근 :

2. 접근제어 – 기본 클래스에 대한 접근 Public 상속 파생 클래스를 기본 클래스의 하위 타입으로 만든다 일반적인 형태 2 ) Protected 상속 어떤 클래스 계통이 파생을 염두 에 두고 설계되었을 경우 적당 3) Private 상속 기본 클래스에 대한 인터페이스를 차단하여 엄격한 독립성 보장

2. 접근제어 – 기본 클래스에 대한 접근 :

2. 접근제어 – 기본 클래스에 대한 접근 Private Protected Public B 의 public 멤버에 대한 접근 D 의 멤버 함수 / 프렌드 D 의 멤버 함수 / 프렌드 D 의 파생 클래스의 멤버함수 / 프렌드 어떤 함수에서든 사용 가능 B 의 protected 멤버에 대한 접근 B 의 public 멤버에 대한 접근 D 의 멤버 함수 / 프렌드 D 의 파생 클래스의 멤버함수 / 프렌드 D 의 멤버 함수 / 프렌드 D 의 파생클래스의 멤버 함수 / 프렌드 D* 를 B* 로 변환 D 의 멤버 함수 / 프렌드 D 의 멤버 함수 / 프렌드 D 의 파생 클래스의 멤버함수 / 프렌드 어떤 함수에서든 사용 가능 기본 클래스 B, 파생 클래스 D

3. 런타임 타입 정보:

3 . 런타임 타입 정보 런타임에 얻어지는 타입 정보 ( Run-Time Type Information) 프로그램 실행 도중에 객체의 데이터형을 결정 하는 표준 방법을 제공 d ynamic_cast , typeid , type_info

3. 런타임 타입 정보 - dynamic_cast:

3 . 런타임 타입 정보 - dynamic_cast - 포인터가 지시하는 객체형이 무엇인지 정확하게 알려주지는 않지만 , 객체의 주소를 특정형의 포인터에 안전하게 대입할 수 있는지 알려준다 . 같은 Type 이거나 직 , 간접적으로 파생된 객체일 경우 변환 포인터의 타입은 다형성을 가져야 한다 . B *b; If(A * a = dynamic<A*>(b)) b 가 가리키고 있는 객체의 타입은 A 가 될수 있는가 ?

3. 런타임 타입 정보 - dynamic_cast 동작원리:

3 . 런타임 타입 정보 - dynamic_cast 동작원리 d ynamic_cast <T*>(p) p NULL 반환 T* 반환 가리키는 객체가 있는가 ? 객체의 타입이 T 인가 ? 아니면 T 타입의 기본클래스를 하나 가지고 있는가 ? NO NO YES YES

3. 런타임 타입 정보 - dynamic_cast 동작원리2:

3 . 런타임 타입 정보 - dynamic_cast 동작원리 2 … vptr … “B” bases “A” B: 가상함수테이블 : Tpye_info : Tpye_info :

3. 런타임 타입 정보 - typeid, type_info:

3 . 런타임 타입 정보 - typeid , type_info typeid 연산자 두 객체의 데이터형이 같은지 결정할 수 있다 . type_info 클래스 Typeid 가 반환하는 객체 데이터형 비교가 가능하도록 == 와 != 연산자 오버로딩

3. 런타임 타입 정보:

3 . 런타임 타입 정 보 진짜 필요할 때만 써야함 ! 정적 ( 컴파일 타임 ) 타입 점검 을 쓰는 것이 좋다 . 안정성 오버헤드 적음 프로그램 구조화

4. 멤버에 대한 포인터:

4. 멤버에 대한 포인터 클래스의 멤버를 간접적으로 참조

5. 클래스와 자유저장공간:

5. 클래스와 자유저장공간 1) operator new() / operator delete() 자동으로 정적 멤버 이도록 되어있음 2) size_t 객체의 크기를 넘길 수 있다 . 3) New 연산자 동작원리 operator new() 호출 생성자 호출

5. 클래스와 자유저장공간:

5. 클래스와 자유저장공간 Empleyee * p = new Manager; delete p ; 문제 ! 실제 객체인 Manager 가 해제 안됨 가상 소멸자 필요 virtual ~Employee(); 이 클래스의 파생 클래스 모두가 소멸자를 가지게 되어 Manager 또한 해제된다 해 결 !

authorStream Live Help