[C++] 상속과 캐스팅(Inheritance & casting)

11
상속과 캐스팅 ( Inheritance & Casting ) FaceBook Group "코딩의 아침" Self Study & Sharing

Transcript of [C++] 상속과 캐스팅(Inheritance & casting)

Page 1: [C++] 상속과 캐스팅(Inheritance & casting)

상속과 캐스팅 ( Inheritance & Casting )

FaceBook Group "코딩의 아침"

Self Study & Sharing

Page 2: [C++] 상속과 캐스팅(Inheritance & casting)

Ø 상속관계 "IS - A 상속"

CMonster

CJumpMonster

CFlyMonster

Monster의 기본 속성을 갖고있는부모의 모든 데이터를

JumpMonster / FlyMonster가상속받고,

자신의 고유특성인Jump / Fly 가 새로 추가된 형태

Parents

Child

Inheritance

üJumpMonster is Monster / FlyMonster is Monster 의 관계가 성립된다.

Page 3: [C++] 상속과 캐스팅(Inheritance & casting)

Ø 상속관계 "HAS - A 상속"

CJumpMonster

CFlyMonster

CSteelSpring

CAngelWing

만약, 기본능력으로 생성된 후

JumpMonster는 추진력을 얻기위해 Spring을 갖고 있어야하고,

FlyMonster는 천상계로 가기위해 천사날개를 얻어야 한다면?

ü 모든 몬스터가 +특성을 상속 받는 형태가 아닌, 소유하는 있는 방식의 형태 üJumpMonster has SteelSpring / FlyMonster has AngelWing 의 관계가 성립된다.

Page 4: [C++] 상속과 캐스팅(Inheritance & casting)

Ø 상속관계 "Casting이란?"

CMonster

CJumpMonster

CFlyMonster

Parents

Child

Inheritance

- (1) 상속관계에 있는 클래스끼리

형(TYPE)변환이 가능하다.

- (2) 부모 포인터(Parents*)

자식 포인터(Child*) 의 참조변수에

따라 사용방식이 달라 진다.

Ø Casting방식은 자신이 접근하고자는 유효한 범위에 따라 캐스팅 방식을 선택할 수 있다.

Page 5: [C++] 상속과 캐스팅(Inheritance & casting)

Ø 상속관계 "Up Casting"

§ 하위 클래스에서 상위클래스로 Casting한 경우§ 자식객체 참조를 부모형 포인터로 받은 경우를 말한다.§ 다형성(virtual)관계에 있을 경우, 자식의 함수가 호출 된다.

Parents

Child

virtual void Move (void) { cout << "부모움직임" <<endl; } void Name(void) { cout << "나는 부모" <<endl; }

virtual void Move (void) { cout << "자식움직임" <<endl; } void Name(void) { cout << "나는 자식" <<endl; }

만약 Parents* pObj = new Child 한 경우 Move함수와 Name함수를 호출한다고 했을때 어떤 결과가 나올까?

(호출 x )

(호출 o )

(호출 x )

(호출 o )

Page 6: [C++] 상속과 캐스팅(Inheritance & casting)

모두 자식의 함수가 호출되지 않았다.virtual함수는 오버라이딩에 의해 자식의 함수가 호출되었으나,자식의 멤버함수 Name( ) 호출되지 않았다.

Ø Up Casting 예시

Page 7: [C++] 상속과 캐스팅(Inheritance & casting)

Ø 상속관계 "Down Casting"

§ 상위클래스에서 하위클래스쪽으로 Casting을 하는 경우§ Up캐스팅된 참조변수를 본래의 참조변수로 되돌릴 경우 사용한다.

Parents

Child

virtual void Move (void) { cout << "부모움직임" <<endl; } void Name(void) { cout << "나는 부모" <<endl; }

virtual void Move (void) { cout << "자식움직임" <<endl; } void Name(void) { cout << "나는 자식" <<endl; }

Parents* pObj = new Child 의 경우에, Child의 Name함수를 호출하기 위해 업캐스팅 된 참조변수의 변경이 필요하다.

멤버함수를 호출하기 위해 C++캐스팅을 활용해 보자.

Page 8: [C++] 상속과 캐스팅(Inheritance & casting)

Ø Down Casting 예시 (1)

u C 스타일 캐스팅

- ( ) 안에 캐스팅하고자 하는 클래스의 포인터를 넣어준다.- C스타일의 캐스팅으로, 정말 강력한 캐스팅이다. 좋은 의미일까? 아니다. - 가독성을 떨어뜨릴 뿐만 아니라, 컴파일러를 속여 무분별한 캐스팅을 한다면? 상상하고 싶지 않다.

Page 9: [C++] 상속과 캐스팅(Inheritance & casting)

Ø Down Casting 예시 (2)

u C++ 스타일 캐스팅 - reinterpret_cast

- reinterpret_cast<포인터형>(대상) 으로 사용한다.- C스타일 캐스팅과 유사한 캐스팅이다.- 강제형변환이 가능한 캐스팅이기 때문에 C스타일 캐스팅처럼 매우 불안한 캐스팅이라 볼 수 있다.

Page 10: [C++] 상속과 캐스팅(Inheritance & casting)

Ø Down Casting 예시 (3)

u C++ 스타일 캐스팅 - dynamic_cast

- dynamic_cast<포인터형>(대상) 으로 사용 한다.- 상속관계의 캐스팅에서 사용한다. - 단, 다운캐스팅할 포인터 변수의 대상이 좁은 범위(부모)에서 넓은 범위(자식)로 캐스팅하는 경우 NULL을 반환한다. 으로 pParents 포인터 변수를 받은 경우, 이후, 자식형으로 다운캐스팅을 시도할 경우 NULL값을 반환하므로, 예외처리를 해주면 좋다.

Page 11: [C++] 상속과 캐스팅(Inheritance & casting)