SlideShare a Scribd company logo
1 of 21
Download to read offline
12. 상속 : 고급
차례
•
•
•
•

상속에서 멤버 함수 재정의
추상 클래스
동적 형 변환
다중 상속

2/21
함수 오라이딩/동적결합/다형성/가상함
수1
• 함수 오버라이딩 (Function Overriding)
– 기반 클래스의 멤버 함수를 파생 클래스에서
다시 정의하는 것

• 동적 결합 (Dynamic Binding)
– 실행 시 호출될 함수를 결정하는 것으로 이는
하나의 함수가 여러 클래스에서 오버라이딩되
었을때 사용

3/21
함수 오라이딩/동적결합/다형성/가상함수 2
• 다형성(Polymorphism)
– 하나의 함수가 여러 구현 형태로 정의되는 것
을 다형성이라 함

• 다형성에 의해 함수 재정의시 요구조건
– 기반 클래스의 멤버 함수가 가상함수로 선언
되어야 함
– 함수에서 매개변수로 전달된 변수는 객체의
주소를 포함해야 함
4/21
함수 오라이딩/동적결합/다형성/가상함수 3
• 가상함수
– 함수 오버라이딩을 목적으로 기반 클래스의
함수
– 함수 선언시 virtual 키워드를 표시함
virtual 함수리턴형 함수이름( ) ;

5/21
소스 12-2 (ch12_02.cpp) – 동적결합이 안된 경우
#include <iostream>
using namespace std;
class A
{
public:

};

string ClassMessage()
{
return "class A";
}

class B : public A
{
public:
string ClassMessage()
{
return "class B";
}
};

void TestFunction1(A x)
{
cout << x.ClassMessage().data() << endl;
}
int main()
{

A a;
B b;
TestFunction1(a);
TestFunction1(b);

}

return 0;

예상 실행 결과 :
class A
class B

실제 실행 결과 :
class A
class A
6/21
소스 12-3 (ch12_03.cpp) – 동적결합
수정 내용 (ch12_03.cpp)

기존 내용 (ch12_02.cpp)

#include <iostream>
using namespace std;

#include <iostream>
using namespace std;

class A
{
public:

class A
{
public:

};

string ClassMessage()
{
return "class A";
}

class B : public A
{
public:
string ClassMessage()
{
return "class B";
}
};

};

virtual string ClassMessage()
{
return "class A";
}

class B : public A
{
public:
string ClassMessage()
{
return "class B";
}
};

7/21
소스 12-2 (ch12_03.cpp) – 동적결합
수정 내용 (ch12_03.cpp)

기존 내용 (ch12_02.cpp)

void TestFunction1(A x)
{
cout << x.ClassMessage().data() << endl;
}

void TestFunction1(A *x)
{
cout << x->ClassMessage().data() << endl;
}

int main()
{

int main()
{

A a;
B b;

A a;
B b;

TestFunction1(a);
TestFunction1(b);
}

TestFunction1(&a);
TestFunction1(&b);

return 0;

return 0;

실행 결과 :
class A
class A

}

실행 결과 :
class A
class B
8/21
추상 클래스
• 순수 가상 함수 (Pure Virtual Function)
– 함수 내용을 정의하지 않고 파생 클래스에서 함수
오버라이딩에 의해 내용이 결정되는 형태의 함수
virtual

반환형

함수이름( ) =0;

• 추상 클래스 (Abstract Class)
– 객체 생성이 목적이 아닌 클래스
– 상속에서 기반 클래스 역할을 담당
– 순수 가상 함수를 포함
9/21
소스 12-5 ( ch12_04.cpp)
#include <iostream>
#include <string>
using namespace std;
class AbstractClass
{
public:
virtual string SampleFunction()=0;
};
class TestClass : public AbstractClass
{
public:
string SampleFunction()
{
return "SampleFunction";
}
};

int main()
{
AbstractClass obj1;
cout << obj1.SampleFunction() << endl;
}

return 0;

추상 클래스 AbstractClass는 객체
를 생성하지 못함!!!  Error!!!

10/21
소스 12-5 ( ch12_04.cpp)
#include <iostream>
#include <string>
using namespace std;
class AbstractClass
{
public:
virtual string SampleFunction()=0;
};
class TestClass : public AbstractClass
{
public:
string SampleFunction()
{
return "SampleFunction";
}
};

int main()
{
TestClass obj1;
cout << obj1.SampleFunction() << endl;
}

return 0;

파생 클래스 TestClass로 객체 생성!!!

11/21
다음의 클래스를 정의하자.

실습 1-1

클래스 이름: GeometricObject
멤버 변수: 두 개의 선(line1, line2)으로 구성된 배정도형 자료를 다루며, 클래스
상속 시 파생 클래스에서 참조케 함
멤버 함수
생성자: 매개변수 없이 멤버 변수를 0으로 초기화
생성자: 두 개의 멤버 변숫값을 매개변수로 전달하여 초기화
각각의 멤버 변숫값을 매개변수로 전달하여 초기화
각각의 멤버 변숫값을 객체 외부로 전달
멤버 변수를 이용하여 도형의 면적을 계산하는 순수 가상 함수
(AreaCalculation)
멤버 변수를 이용하여 도형의 둘레를 계산하는 순수 가상 함수
(RoundCalculation)

12/21
실습 1-2
클래스 이름: Isosceles
GeometricObject를 기반 클래스로 하는 파생 클래스
멤버 변수: 이등변 삼각형의 밑면, 높이, 면적(area)과 등변(side)으로 구성되며 밑
변과 높이는 기반 클래스의 멤버 변수 line1과 line2로 사용함
멤버 함수
생성자: 매개변수 없이 멤버 변수를 0으로 초기화
생성자: 밑변과 높이의 값을 매개변수로 전달하여 초기화하고 나머지 멤버
변수는 0으로 초기화
기반 클래스의 AddCalculation( )을 면적 계산 함수로 함수 오버라이딩
기반 클래스의 Compute( )을 등변 계산 함수로 함수 오버라이딩
멤버 변수인 면적과 등변을 각각 객체 외부로 전달

13/21
실습 1-3
클래스 이름: Rectangle
GeometricObject를 기반 클래스로 하는 파생 클래스
멤버 변수: 사각형의 가로와 세로, 면적(area)과 둘레(round)로 구성됨, 가로와 세
로는 기반 클래스의 멤버 변수 line1과 line2로 사용함
멤버 함수
생성자: 매개변수 없이 멤버 변수를 0으로 초기화
생성자: 가로와 세로의 값을 매개변수로 전달하여 초기화하고 나머지 멤버
변수는 0으로 초기화
기반 클래스의 AddCalculation( )을 면적 계산 함수로 함수 오버라이딩
기반 클래스의 Compute( )을 사각형 둘레 계산 함수로 함수 오버라이딩
멤버 변수인 넓이와 둘레를 각각 객체 외부로 전달

14/21
동적 형 변환
• 동적 형 변환
– 클래스 상속에서 파생 클래스의 객체를 기반
클래스 형으로 변환(업캐스팅;Upcasting) 것
또는 기반 클래스의 객체를 파생 클래스 형으
로 변환(다운캐스팅;Downcasting)하는 것
– 객체의 포인터를 변환을 원하는 클래스의 포
인터로 할당
객체포인터1 = dynamic_cast <클래스이름*> (객체 포인터2)

15/21
업 캐스팅 예제 – 소스 12-11(ch12_05.cpp)
업캐스팅은 자동으로 형변환이 실행됨 (기반  파생)
#include "ch12_GeometricObject.h"
int main()
{
GeometricObject *p1 = new Isosceles(9,15);
Isosceles *p2 = new Isosceles(5,6);
cout << "p1 : " << p1->GetLine1() << endl;
cout << "p2 : " << p2->GetLine1() << endl;
}

return 0;

16/21
다운 캐스팅 예제 – 소스 12-12(ch12_06.cpp)
다운캐스팅은 dynamic_cast 연산자가 명시되어야 함 (파생  기반)
#include "ch12_GeometricObject.h"
void DisplayGeometricObject(GeometricObject &object)
{
cout << "line1 : " << object.GetLine1() << endl;
cout << "line2 : " << object.GetLine2() << endl;

매개변수로 전달받은
GeometricObject 객체 포인터
주소를 저장

GeometricObject *p=&object;
Isosceles *p1 = dynamic_cast<Isosceles*>(p); //다운 캐스팅
Rectangle *p2 = dynamic_cast<Rectangle*>(p); //다운 캐스팅
if (p1 != NULL)
{
p1->AreaCalculation();
p1->Compute();

}

cout << "이등변 삼각형의 넓이 : " << p1->GetArea() << endl;
cout << "이등변 삼각형의 등변 : " << p1->GetSide() << endl;
17/21
if (p2 != NULL)
{
p2->AreaCalculation();
p2->Compute();

}
int main()
{

}

cout << "사각형의 넓이 : " << p2->GetArea() << endl;
cout << "사각형의 둘레 : " << p2->GetRound() << endl;

Isosceles p1(9, 15);
Rectangle p2(10, 12);
DisplayGeometricObject(p1);
cout << "****************************" << endl;
DisplayGeometricObject(p2);

}

return 0;
18/21
소스 12-12 설명
• 36번 라인 DisplayGeometricObject(Isosceles p1); 이 호출되면 함수에서 p1은
정상적인 주소의 객체, p2는 NULL이 할당되며 여러 번 동적 형 변환이 발생함!!

• 37번 라인 DisplayGeometricObject(Rectangle p2); 이 호출되면 함수에서 p1은
NULL이 할당되고 , p2는 정상적인 주소의 객체가 할당되고 여러 번 동적 변환이
발생함

19/21
다중 상속
• 클래스 상속의 형태
기반 클래스

기반 클래스
파생 클래스1

파생 클래스

기반 클래스1

기반 클래스2
파생 클래스

파생 클래스2
기반 클래스
파생 클래스
파생 클래스

20/21
소스 12-13~소스 12-17
(ch12_multi.h, ch12_multi.cpp, ch12_07.cpp)
class ScoreSource
{
………………………..
};
class RankGrade
{
………………………..
};
class SungJuk : public ScoreSource, public RankGrade
{
………………………..
};

21/21

More Related Content

What's hot

UML distilled 1장 스터디 발표 자료
UML distilled 1장 스터디 발표 자료UML distilled 1장 스터디 발표 자료
UML distilled 1장 스터디 발표 자료beom kyun choi
 
Java Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJava Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJavajigi Jaesung
 
자바8강의 0강. java8 overview
자바8강의 0강. java8 overview자바8강의 0강. java8 overview
자바8강의 0강. java8 overviewSejong Park
 
[113]how can realm_make_efficient_mobile_database
[113]how can realm_make_efficient_mobile_database[113]how can realm_make_efficient_mobile_database
[113]how can realm_make_efficient_mobile_databaseNAVER D2
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성HyeonSeok Choi
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicknight1128
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료욱진 양
 
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?NAVER D2
 
Kth개발자 세미나 1회
Kth개발자 세미나 1회Kth개발자 세미나 1회
Kth개발자 세미나 1회Byeongsu Kang
 
Java9 특징 훑어보기
Java9 특징 훑어보기Java9 특징 훑어보기
Java9 특징 훑어보기duriepark 유현석
 
안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주iamhjoo (송형주)
 
1. introduction to java8
1. introduction to java81. introduction to java8
1. introduction to java8흥래 김
 
#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8Sangmin Lee
 
[243]kaleido 노현걸
[243]kaleido 노현걸[243]kaleido 노현걸
[243]kaleido 노현걸NAVER D2
 
7가지 동시성 모델 람다아키텍처
7가지 동시성 모델  람다아키텍처7가지 동시성 모델  람다아키텍처
7가지 동시성 모델 람다아키텍처Sunggon Song
 
3주차. stream api advance
3주차. stream api advance 3주차. stream api advance
3주차. stream api advance Sejong Park
 

What's hot (19)

UML distilled 1장 스터디 발표 자료
UML distilled 1장 스터디 발표 자료UML distilled 1장 스터디 발표 자료
UML distilled 1장 스터디 발표 자료
 
Java Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJava Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte Code
 
자바8강의 0강. java8 overview
자바8강의 0강. java8 overview자바8강의 0강. java8 overview
자바8강의 0강. java8 overview
 
[113]how can realm_make_efficient_mobile_database
[113]how can realm_make_efficient_mobile_database[113]how can realm_make_efficient_mobile_database
[113]how can realm_make_efficient_mobile_database
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamic
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료
 
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?
 
Kth개발자 세미나 1회
Kth개발자 세미나 1회Kth개발자 세미나 1회
Kth개발자 세미나 1회
 
Java9 특징 훑어보기
Java9 특징 훑어보기Java9 특징 훑어보기
Java9 특징 훑어보기
 
Java 기초
Java 기초Java 기초
Java 기초
 
안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주
 
1. introduction to java8
1. introduction to java81. introduction to java8
1. introduction to java8
 
#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8
 
[243]kaleido 노현걸
[243]kaleido 노현걸[243]kaleido 노현걸
[243]kaleido 노현걸
 
HTTP web server 구현
HTTP web server 구현HTTP web server 구현
HTTP web server 구현
 
7가지 동시성 모델 람다아키텍처
7가지 동시성 모델  람다아키텍처7가지 동시성 모델  람다아키텍처
7가지 동시성 모델 람다아키텍처
 
3주차. stream api advance
3주차. stream api advance 3주차. stream api advance
3주차. stream api advance
 

Similar to 13th chapter12 slide

12장 상속 (고급)
12장 상속 (고급)12장 상속 (고급)
12장 상속 (고급)유석 남
 
Kubernetes & helm 활용
Kubernetes & helm 활용Kubernetes & helm 활용
Kubernetes & helm 활용SK Telecom
 
09장 객체와 클래스 (고급)
09장 객체와 클래스 (고급)09장 객체와 클래스 (고급)
09장 객체와 클래스 (고급)유석 남
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰beom kyun choi
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가Vong Sik Kong
 
Javascript - Function
Javascript - FunctionJavascript - Function
Javascript - Functionwonmin lee
 
자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수유진 변
 
스위프트 성능 이해하기
스위프트 성능 이해하기스위프트 성능 이해하기
스위프트 성능 이해하기Yongha Yoo
 
9 object class
9 object class9 object class
9 object class웅식 전
 
객체지향 프로그래밍 기본
객체지향 프로그래밍 기본객체지향 프로그래밍 기본
객체지향 프로그래밍 기본용호 최
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)문익 장
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기jongho jeong
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍Young-Beom Rhee
 
Android ndk jni 설치및 연동
Android ndk jni 설치및 연동Android ndk jni 설치및 연동
Android ndk jni 설치및 연동Sangon Lee
 
[IT기술칼럼#2] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원
[IT기술칼럼#2] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원[IT기술칼럼#2] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원
[IT기술칼럼#2] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원탑크리에듀(구로디지털단지역3번출구 2분거리)
 

Similar to 13th chapter12 slide (20)

12장 상속 (고급)
12장 상속 (고급)12장 상속 (고급)
12장 상속 (고급)
 
Kubernetes & helm 활용
Kubernetes & helm 활용Kubernetes & helm 활용
Kubernetes & helm 활용
 
09장 객체와 클래스 (고급)
09장 객체와 클래스 (고급)09장 객체와 클래스 (고급)
09장 객체와 클래스 (고급)
 
[Codelab 2017] ReactJS 기초
[Codelab 2017] ReactJS 기초[Codelab 2017] ReactJS 기초
[Codelab 2017] ReactJS 기초
 
C++에서 Objective-C까지
C++에서 Objective-C까지C++에서 Objective-C까지
C++에서 Objective-C까지
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가
 
Javascript - Function
Javascript - FunctionJavascript - Function
Javascript - Function
 
자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수
 
스위프트 성능 이해하기
스위프트 성능 이해하기스위프트 성능 이해하기
스위프트 성능 이해하기
 
javascript01
javascript01javascript01
javascript01
 
Clean code appendix 1
Clean code appendix 1Clean code appendix 1
Clean code appendix 1
 
9 object class
9 object class9 object class
9 object class
 
객체지향 프로그래밍 기본
객체지향 프로그래밍 기본객체지향 프로그래밍 기본
객체지향 프로그래밍 기본
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
 
Anatomy of Realm
Anatomy of RealmAnatomy of Realm
Anatomy of Realm
 
Android ndk jni 설치및 연동
Android ndk jni 설치및 연동Android ndk jni 설치및 연동
Android ndk jni 설치및 연동
 
[IT기술칼럼#2] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원
[IT기술칼럼#2] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원[IT기술칼럼#2] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원
[IT기술칼럼#2] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원
 

More from 웅식 전

15 3. modulization
15 3. modulization15 3. modulization
15 3. modulization웅식 전
 
15 2. arguement passing to main
15 2. arguement passing to main15 2. arguement passing to main
15 2. arguement passing to main웅식 전
 
12 2. dynamic allocation
12 2. dynamic allocation12 2. dynamic allocation
12 2. dynamic allocation웅식 전
 
12 1. multi-dimensional array
12 1. multi-dimensional array12 1. multi-dimensional array
12 1. multi-dimensional array웅식 전
 
11. array & pointer
11. array & pointer11. array & pointer
11. array & pointer웅식 전
 
10. pointer & function
10. pointer & function10. pointer & function
10. pointer & function웅식 전
 
7. variable scope rule,-storage_class
7. variable scope rule,-storage_class7. variable scope rule,-storage_class
7. variable scope rule,-storage_class웅식 전
 
5 2. string processing
5 2. string processing5 2. string processing
5 2. string processing웅식 전
 
5 1. character processing
5 1. character processing5 1. character processing
5 1. character processing웅식 전
 
15 1. enumeration, typedef
15 1. enumeration, typedef15 1. enumeration, typedef
15 1. enumeration, typedef웅식 전
 
3 2. if statement
3 2. if statement3 2. if statement
3 2. if statement웅식 전
 
3 1. preprocessor, math, stdlib
3 1. preprocessor, math, stdlib3 1. preprocessor, math, stdlib
3 1. preprocessor, math, stdlib웅식 전
 
2 3. standard io
2 3. standard io2 3. standard io
2 3. standard io웅식 전
 
2 2. operators
2 2. operators2 2. operators
2 2. operators웅식 전
 
2 1. variables & data types
2 1. variables & data types2 1. variables & data types
2 1. variables & data types웅식 전
 

More from 웅식 전 (20)

15 3. modulization
15 3. modulization15 3. modulization
15 3. modulization
 
15 2. arguement passing to main
15 2. arguement passing to main15 2. arguement passing to main
15 2. arguement passing to main
 
14. fiile io
14. fiile io14. fiile io
14. fiile io
 
13. structure
13. structure13. structure
13. structure
 
12 2. dynamic allocation
12 2. dynamic allocation12 2. dynamic allocation
12 2. dynamic allocation
 
12 1. multi-dimensional array
12 1. multi-dimensional array12 1. multi-dimensional array
12 1. multi-dimensional array
 
11. array & pointer
11. array & pointer11. array & pointer
11. array & pointer
 
10. pointer & function
10. pointer & function10. pointer & function
10. pointer & function
 
9. pointer
9. pointer9. pointer
9. pointer
 
7. variable scope rule,-storage_class
7. variable scope rule,-storage_class7. variable scope rule,-storage_class
7. variable scope rule,-storage_class
 
6. function
6. function6. function
6. function
 
5 2. string processing
5 2. string processing5 2. string processing
5 2. string processing
 
5 1. character processing
5 1. character processing5 1. character processing
5 1. character processing
 
15 1. enumeration, typedef
15 1. enumeration, typedef15 1. enumeration, typedef
15 1. enumeration, typedef
 
4. loop
4. loop4. loop
4. loop
 
3 2. if statement
3 2. if statement3 2. if statement
3 2. if statement
 
3 1. preprocessor, math, stdlib
3 1. preprocessor, math, stdlib3 1. preprocessor, math, stdlib
3 1. preprocessor, math, stdlib
 
2 3. standard io
2 3. standard io2 3. standard io
2 3. standard io
 
2 2. operators
2 2. operators2 2. operators
2 2. operators
 
2 1. variables & data types
2 1. variables & data types2 1. variables & data types
2 1. variables & data types
 

13th chapter12 slide

  • 1. 12. 상속 : 고급
  • 2. 차례 • • • • 상속에서 멤버 함수 재정의 추상 클래스 동적 형 변환 다중 상속 2/21
  • 3. 함수 오라이딩/동적결합/다형성/가상함 수1 • 함수 오버라이딩 (Function Overriding) – 기반 클래스의 멤버 함수를 파생 클래스에서 다시 정의하는 것 • 동적 결합 (Dynamic Binding) – 실행 시 호출될 함수를 결정하는 것으로 이는 하나의 함수가 여러 클래스에서 오버라이딩되 었을때 사용 3/21
  • 4. 함수 오라이딩/동적결합/다형성/가상함수 2 • 다형성(Polymorphism) – 하나의 함수가 여러 구현 형태로 정의되는 것 을 다형성이라 함 • 다형성에 의해 함수 재정의시 요구조건 – 기반 클래스의 멤버 함수가 가상함수로 선언 되어야 함 – 함수에서 매개변수로 전달된 변수는 객체의 주소를 포함해야 함 4/21
  • 5. 함수 오라이딩/동적결합/다형성/가상함수 3 • 가상함수 – 함수 오버라이딩을 목적으로 기반 클래스의 함수 – 함수 선언시 virtual 키워드를 표시함 virtual 함수리턴형 함수이름( ) ; 5/21
  • 6. 소스 12-2 (ch12_02.cpp) – 동적결합이 안된 경우 #include <iostream> using namespace std; class A { public: }; string ClassMessage() { return "class A"; } class B : public A { public: string ClassMessage() { return "class B"; } }; void TestFunction1(A x) { cout << x.ClassMessage().data() << endl; } int main() { A a; B b; TestFunction1(a); TestFunction1(b); } return 0; 예상 실행 결과 : class A class B 실제 실행 결과 : class A class A 6/21
  • 7. 소스 12-3 (ch12_03.cpp) – 동적결합 수정 내용 (ch12_03.cpp) 기존 내용 (ch12_02.cpp) #include <iostream> using namespace std; #include <iostream> using namespace std; class A { public: class A { public: }; string ClassMessage() { return "class A"; } class B : public A { public: string ClassMessage() { return "class B"; } }; }; virtual string ClassMessage() { return "class A"; } class B : public A { public: string ClassMessage() { return "class B"; } }; 7/21
  • 8. 소스 12-2 (ch12_03.cpp) – 동적결합 수정 내용 (ch12_03.cpp) 기존 내용 (ch12_02.cpp) void TestFunction1(A x) { cout << x.ClassMessage().data() << endl; } void TestFunction1(A *x) { cout << x->ClassMessage().data() << endl; } int main() { int main() { A a; B b; A a; B b; TestFunction1(a); TestFunction1(b); } TestFunction1(&a); TestFunction1(&b); return 0; return 0; 실행 결과 : class A class A } 실행 결과 : class A class B 8/21
  • 9. 추상 클래스 • 순수 가상 함수 (Pure Virtual Function) – 함수 내용을 정의하지 않고 파생 클래스에서 함수 오버라이딩에 의해 내용이 결정되는 형태의 함수 virtual 반환형 함수이름( ) =0; • 추상 클래스 (Abstract Class) – 객체 생성이 목적이 아닌 클래스 – 상속에서 기반 클래스 역할을 담당 – 순수 가상 함수를 포함 9/21
  • 10. 소스 12-5 ( ch12_04.cpp) #include <iostream> #include <string> using namespace std; class AbstractClass { public: virtual string SampleFunction()=0; }; class TestClass : public AbstractClass { public: string SampleFunction() { return "SampleFunction"; } }; int main() { AbstractClass obj1; cout << obj1.SampleFunction() << endl; } return 0; 추상 클래스 AbstractClass는 객체 를 생성하지 못함!!!  Error!!! 10/21
  • 11. 소스 12-5 ( ch12_04.cpp) #include <iostream> #include <string> using namespace std; class AbstractClass { public: virtual string SampleFunction()=0; }; class TestClass : public AbstractClass { public: string SampleFunction() { return "SampleFunction"; } }; int main() { TestClass obj1; cout << obj1.SampleFunction() << endl; } return 0; 파생 클래스 TestClass로 객체 생성!!! 11/21
  • 12. 다음의 클래스를 정의하자. 실습 1-1 클래스 이름: GeometricObject 멤버 변수: 두 개의 선(line1, line2)으로 구성된 배정도형 자료를 다루며, 클래스 상속 시 파생 클래스에서 참조케 함 멤버 함수 생성자: 매개변수 없이 멤버 변수를 0으로 초기화 생성자: 두 개의 멤버 변숫값을 매개변수로 전달하여 초기화 각각의 멤버 변숫값을 매개변수로 전달하여 초기화 각각의 멤버 변숫값을 객체 외부로 전달 멤버 변수를 이용하여 도형의 면적을 계산하는 순수 가상 함수 (AreaCalculation) 멤버 변수를 이용하여 도형의 둘레를 계산하는 순수 가상 함수 (RoundCalculation) 12/21
  • 13. 실습 1-2 클래스 이름: Isosceles GeometricObject를 기반 클래스로 하는 파생 클래스 멤버 변수: 이등변 삼각형의 밑면, 높이, 면적(area)과 등변(side)으로 구성되며 밑 변과 높이는 기반 클래스의 멤버 변수 line1과 line2로 사용함 멤버 함수 생성자: 매개변수 없이 멤버 변수를 0으로 초기화 생성자: 밑변과 높이의 값을 매개변수로 전달하여 초기화하고 나머지 멤버 변수는 0으로 초기화 기반 클래스의 AddCalculation( )을 면적 계산 함수로 함수 오버라이딩 기반 클래스의 Compute( )을 등변 계산 함수로 함수 오버라이딩 멤버 변수인 면적과 등변을 각각 객체 외부로 전달 13/21
  • 14. 실습 1-3 클래스 이름: Rectangle GeometricObject를 기반 클래스로 하는 파생 클래스 멤버 변수: 사각형의 가로와 세로, 면적(area)과 둘레(round)로 구성됨, 가로와 세 로는 기반 클래스의 멤버 변수 line1과 line2로 사용함 멤버 함수 생성자: 매개변수 없이 멤버 변수를 0으로 초기화 생성자: 가로와 세로의 값을 매개변수로 전달하여 초기화하고 나머지 멤버 변수는 0으로 초기화 기반 클래스의 AddCalculation( )을 면적 계산 함수로 함수 오버라이딩 기반 클래스의 Compute( )을 사각형 둘레 계산 함수로 함수 오버라이딩 멤버 변수인 넓이와 둘레를 각각 객체 외부로 전달 14/21
  • 15. 동적 형 변환 • 동적 형 변환 – 클래스 상속에서 파생 클래스의 객체를 기반 클래스 형으로 변환(업캐스팅;Upcasting) 것 또는 기반 클래스의 객체를 파생 클래스 형으 로 변환(다운캐스팅;Downcasting)하는 것 – 객체의 포인터를 변환을 원하는 클래스의 포 인터로 할당 객체포인터1 = dynamic_cast <클래스이름*> (객체 포인터2) 15/21
  • 16. 업 캐스팅 예제 – 소스 12-11(ch12_05.cpp) 업캐스팅은 자동으로 형변환이 실행됨 (기반  파생) #include "ch12_GeometricObject.h" int main() { GeometricObject *p1 = new Isosceles(9,15); Isosceles *p2 = new Isosceles(5,6); cout << "p1 : " << p1->GetLine1() << endl; cout << "p2 : " << p2->GetLine1() << endl; } return 0; 16/21
  • 17. 다운 캐스팅 예제 – 소스 12-12(ch12_06.cpp) 다운캐스팅은 dynamic_cast 연산자가 명시되어야 함 (파생  기반) #include "ch12_GeometricObject.h" void DisplayGeometricObject(GeometricObject &object) { cout << "line1 : " << object.GetLine1() << endl; cout << "line2 : " << object.GetLine2() << endl; 매개변수로 전달받은 GeometricObject 객체 포인터 주소를 저장 GeometricObject *p=&object; Isosceles *p1 = dynamic_cast<Isosceles*>(p); //다운 캐스팅 Rectangle *p2 = dynamic_cast<Rectangle*>(p); //다운 캐스팅 if (p1 != NULL) { p1->AreaCalculation(); p1->Compute(); } cout << "이등변 삼각형의 넓이 : " << p1->GetArea() << endl; cout << "이등변 삼각형의 등변 : " << p1->GetSide() << endl; 17/21
  • 18. if (p2 != NULL) { p2->AreaCalculation(); p2->Compute(); } int main() { } cout << "사각형의 넓이 : " << p2->GetArea() << endl; cout << "사각형의 둘레 : " << p2->GetRound() << endl; Isosceles p1(9, 15); Rectangle p2(10, 12); DisplayGeometricObject(p1); cout << "****************************" << endl; DisplayGeometricObject(p2); } return 0; 18/21
  • 19. 소스 12-12 설명 • 36번 라인 DisplayGeometricObject(Isosceles p1); 이 호출되면 함수에서 p1은 정상적인 주소의 객체, p2는 NULL이 할당되며 여러 번 동적 형 변환이 발생함!! • 37번 라인 DisplayGeometricObject(Rectangle p2); 이 호출되면 함수에서 p1은 NULL이 할당되고 , p2는 정상적인 주소의 객체가 할당되고 여러 번 동적 변환이 발생함 19/21
  • 20. 다중 상속 • 클래스 상속의 형태 기반 클래스 기반 클래스 파생 클래스1 파생 클래스 기반 클래스1 기반 클래스2 파생 클래스 파생 클래스2 기반 클래스 파생 클래스 파생 클래스 20/21
  • 21. 소스 12-13~소스 12-17 (ch12_multi.h, ch12_multi.cpp, ch12_07.cpp) class ScoreSource { ……………………….. }; class RankGrade { ……………………….. }; class SungJuk : public ScoreSource, public RankGrade { ……………………….. }; 21/21