C++ Programming

Similar documents
C++ Programming

C++ Programming

Microsoft PowerPoint - additional08.ppt [호환 모드]

Microsoft PowerPoint - additional07.ppt [호환 모드]

C++ Programming

PowerPoint Template

Microsoft PowerPoint - Chapter 6.ppt

Microsoft PowerPoint - additional06.ppt [호환 모드]

윤성우의 열혈 TCP/IP 소켓 프로그래밍

윤성우의 열혈 TCP/IP 소켓 프로그래밍

윤성우의 열혈 TCP/IP 소켓 프로그래밍

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

설계란 무엇인가?

윤성우의 열혈 TCP/IP 소켓 프로그래밍

쉽게 풀어쓴 C 프로그래밍

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

Slide 1

PowerPoint Presentation

슬라이드 1

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

<4D F736F F F696E74202D2038C0E55FB0ADC0C7B3EBC6AE28B0A1BBF3C7D4BCF6BFCD20B4D9C7FCBCBA29>

C++ Programming

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

1. 상속의기본개념 다음과같은문제를위한클래스설계 자동차 속성 : 색상, 배기량, 현재속도 메서드 : 가속하라, 멈춰라, 시동을켜라 트럭 속성 : 색상, 배기량, 현재속도, 최대중량 메서드 : 가속하라, 멈춰라, 시동을켜라 택시 속성 : 색상, 배기량, 현재속도, 요금,

JAVA PROGRAMMING 실습 08.다형성

PowerPoint Presentation

PowerPoint Template

Microsoft PowerPoint - additional01.ppt [호환 모드]

Microsoft PowerPoint - 8ÀÏ°_Æ÷ÀÎÅÍ.ppt

쉽게 풀어쓴 C 프로그래밍

gnu-lee-oop-kor-lec06-3-chap7

PowerPoint Template

PowerPoint 프레젠테이션

Microsoft PowerPoint - additional03.ppt [호환 모드]

Microsoft PowerPoint - C++ 5 .pptx

Microsoft PowerPoint - 6주차.pptx

Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers

4 장클래스와객체 클래스와객체 public과 private 구조체와클래스객체의생성과생성자객체의소멸과소멸자생성자와소멸자의호출순서디폴트생성자와디폴트소멸자멤버초기화멤버함수의외부정의멤버함수의인라인함수선언 C++ 프로그래밍입문

Chapter 6 Objects and Classes

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Slide 1

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

프입2-강의노트-const-friend-static

Microsoft PowerPoint - chap11

Microsoft PowerPoint - [2009] 02.pptx

C++ Programming

Microsoft PowerPoint - java2 [호환 모드]

1. 기본형의형변환복습 C/C++ 형변환의종류 자동형변환 ( 묵시적형변환 ) 강제형변환 ( 명시적형변환 ) 기본형의자동형변환의예 1. 배열 to 포인터변환 배열명은해당배열의첫번째원소의 주소로변환됨 int ary[10]; int *pary = ary; 2. 함수 to 포

Microsoft PowerPoint - chap06-2pointer.ppt

1. 클래스와배열 int 형배열선언및초기화 int ary[5] = 1, 2, 3, 4, 5 ; for (int i = 0; i < 5; i++) cout << "ary[" << i << "] = " << ary[i] << endl; 5 장클래스의활용 1

JAVA PROGRAMMING 실습 05. 객체의 활용

JAVA PROGRAMMING 실습 07. 상속

C++ 기본문법 정리

Microsoft PowerPoint - Chap12-OOP.ppt

Blog

금오공대 컴퓨터공학전공 강의자료

PowerPoint Presentation

Microsoft PowerPoint - Chapter 10.ppt

윤성우의 열혈 TCP/IP 소켓 프로그래밍

chap10.PDF

<4D F736F F F696E74202D2037C1D65FB0ADC0C7B3EBC6AE2837C0E55FBBF3BCD329>

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

Slide 1

Microsoft PowerPoint - 2강

Design Issues

PowerPoint Template

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

윤성우의 열혈 TCP/IP 소켓 프로그래밍

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

Microsoft PowerPoint - Chapter 1-rev

No Slide Title

(Microsoft PowerPoint - java2-lecture3.ppt [\310\243\310\257 \270\360\265\345])

강의계획서 1. 강의개요 학습과목명 객체지향프로그래밍 Ⅰ 학점 3 학점교 강사명교 강사전화번호 강의시간 4시간강의실수강대상 2. 교과목학습목표 4차산업혁명시대의도래로컴퓨터와프로그래밍에대한관심이커지고있으며, 여러분야에서소프트웨어의중요성을강조하며, 새시대를이끌

쉽게 풀어쓴 C 프로그래밍

8. 클래스 D는클래스 A, 클래스 B, 클래스 C로부터상속받아맊들고싶다. 아래빈칸을채우시오. ( 대소문자주의하시오 ) class D { ; Student s; 11. 다음프로그램의실행결과는? 9. 다음프로그램의실행결과는? class A{ A(){cout << " 생성

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밍

슬라이드 1

Programming hwp

JAVA PROGRAMMING 실습 02. 표준 입출력

Microsoft PowerPoint - Chapter 4-rev

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

PowerPoint Presentation

(Microsoft PowerPoint - 11\300\345.ppt [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint - 9ÀÏ°_ÂüÁ¶ÀÚ.ppt

Microsoft PowerPoint - ch07 - 포인터 pm0415

제11장 프로세스와 쓰레드

설계란 무엇인가?

080629_CFP °ø°³¿ë.hwp

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

01-OOPConcepts(2).PDF

Microsoft PowerPoint - CSharp-10-예외처리

Microsoft PowerPoint 장강의노트.ppt

Slide 1

PowerPoint 프레젠테이션

11장 포인터

쉽게 풀어쓴 C 프로그래밍

PowerPoint Template

설계란 무엇인가?

Transcription:

C++ Programming 상속과다형성 Seo, Doo-okok clickseo@gmail.com http://www.clickseo.com

목 차 상속의이해 상속과다형성 다중상속 2

상속과다형성 객체의이해 상속클래스의객체의생성및소멸 상속의조건 상속과다형성 다중상속 3

상속의이해 상속 (Inheritance) 클래스에구현된모든특성 ( 멤버변수와멤버함수 ) 을그대로계승받아 새로운클래스를만드는기능 기반클래스 (Base Class) : Super Class 파생클래스 (Derived class) : Sub Class class DerivedClass : public BaseClass // 자동으로기반클래스의멤버변수와함수를소유 // 새로운멤버변수와함수의추가가능 4

protected 멤버 상속의이해 이해 (cont d) 파생된클래스 ( 상속관계 ) 에서만접근을허용하는멤버 외부접근 : private 내부접근및상속관계 : public class BaseClass private: int a; protected: int b; class DerivedClass : public BaseClass void SetData(void) a = 10; // error b = 20; // 접근가능 int main(void) BaseClass base; // 외부접근 base.a a = 10; // error base.b = 20; // error return 0; 5

3 가지형태의상속 상속의이해 이해 (cont d) Base 클래스의멤버는 Derived 클래스로상속되는과정에서접근권한이변경된다. Base Class 상속형태 public 상속 protected 상속 private 상속 private 접근불가접근불가접근불가 protected protected protected private public public protected private class DerivedClass : public BaseClass class DerivedClass : protected BaseClass class DerivedClass : private BaseClass 6

프로그램예제 : public 상속 상속의이해 이해 (cont d) #include <iostream> class BaseClass private: int a; protected: int b; int c; class DerivedClass : public BaseClass void SetData(void) // a = 10; // error b = 20; c = 30; int main(void) DerivedClass c; // c.a = 10; // error // c.b = 20; // error c.c c = 30; return 0; 7

상속클래스의객체생성및소멸 상속클래스의객체생성과정 1. 메모리공간의할당 2. Base 클래스의생성자실행 3. Derived 클래스의생성자실행 BaseClass(); BaseClass DerivedClass DerivedClass(); 8

상속클래스의객체생성및소멸 (cont d) 프로그램예제 : 상속클래스의객체생성과정 #include <iostream> using std::cin; using std::cout; using std::endl; class BaseClass BaseClass() cout << "Base Class!!!" << endl; class DerivedClass : public BaseClass DerivedClass() cout << "DerivedClass Class!!!" << endl; int main() DerivedClass c; return 0; 9

상속클래스의객체생성및소멸 (cont d) 프로그램예제 : 상속과객체생성과정 (1/3) #include <iostream> #include <cstring> using std::cin; using std::cout; using std::endl; char name[12]; int age; Person Person(); const char GetName() const; int GetAge() const; class Person char name[12]; int age; Student Person(char *name = "", int age = 0) char major[50]; this->age = age; strcpy(this->name, name); Student(); const char *GetMajor() const; void ShowData() const; const char *GetName(void) const return name; int GetAge(void) const return age; 10

상속클래스의객체생성및소멸 (cont d) 프로그램예제 : 상속과객체생성과정 (2/3) class Student : public Person char major[50]; Student(char *name, int age, char *major) : Person(name, age) // this->age = age; // error // strcpy(this->name, name); // error strcpy(this->major, major); const char *GetMajor(void) const return major; void ShowData(void) const cout << " 이름 : " << GetName() << endl; cout << " 나이 : " << GetAge() << endl; cout << " 전공 : " << GetMajor() << endl; 11

상속클래스의객체생성및소멸 (cont d) 프로그램예제 : 상속과객체생성과정 (3/3) int main() Student s("seo, Doo-ok", 20, "Computer"); s.showdata(); return 0; 12

상속클래스의객체생성및소멸 (cont d) 상속클래스의객체소멸과정 1. Derived 클래스의소멸자실행 2. Base 클래스의소멸자실행 BaseClass BaseClass(); ~BaseClass(); DerivedClass DerivedClass(); ~DerivedClass(); 13

상속클래스의객체생성및소멸 (cont d) 프로그램예제 : 상속클래스의객체소멸과정 #include <iostream> using std::cin; using std::cout; using std::endl; class BaseClass BaseClass() cout << "Base Class!!!" << endl; ~BaseClass() cout << "~Base Class!!!" << endl; class DerivedClass : public BaseClass DerivedClass() cout << "DerivedClass Class!!!" << endl; ~DerivedClass() cout << "~DerivedClass Class!!!" << endl; int main() DerivedClass c; return 0; 14

상속의조건 IS-A 관계에의한상속 ~ 은 ~ 이다 가성립하는관계 A student is a person 학생은 ( 일종의 ) 사람이다. Person 불성립 성립 Student class Student : public Person 15

상속의조건 (cont d) IS-A 관계에의한상속 (cont d) 잘못된상속구조 Student 성립 불성립 Person class Person : public Student 16

상속의조건 (cont d) HAS-A(HAVE-A) 관계에의한상속 : 포함관계 하나의클래스가다른클래스의객체를멤버로가지고있을경우 Cudgel HAS-A 관계 The police have a Cudgel. 경찰은몽둥이를소유한다. Police 17

상속의조건 (cont d) HAS-A(HAVE-A) 관계에의한상속 (cont d) 클래스객체멤버 class Cudgel void Swing(void) cout << "Swing a cudgel1!!" << endl; class Police Cudgel c; // 객체멤버 void Useweapon(void) c.swing(); 18

상속의조건 (cont d) 프로그램예제 : HAS-A 관계에의한상속 #include <iostream> using std::cin; using std::cout; using std::endl; class Cudgel void Swing(void) cout << "Swing a cudgel!!!" << endl; class Police Cudgel c; void Useweapon(void) c.swing(); int main() Police p; p.useweapon(); return 0; void Swing(); Cudgel c; Cudgel Student void Useweapon(); 19

상속과다형성 상속의이해 상속과다형성 상속된객체와포인터, 참조 함수재정의 가상함수 다중상속 20

객체포인터 상속된객체와포인터, 참조 객체의주소값을저장할수있는포인터 Person Person Person *p = new Person; *p = new Student; *p = new PartTimeStudent; Person 클래스의객체포인터 (Person *) 는어떤대상체를가리키든지, Person 클래스내에선언된멤버와 Person 클래스가상속한클래스의멤버에만접근이가능하다. 21

상속된객체와포인터, 참조 참조 (cont d) 프로그램예제 : 상속된객체와포인터 (1/2) #include <iostream> using std::cin; using std::cout; using std::endl; class Person void Sleep(void) cout << "Sleep!!!" << endl; class Student : public Person void Study(void) cout << "Study!!!" << endl; class PartTimeStudent : public Student void Work(void) cout << "Work!!!" << endl; Person void Sleep(); Student void Study(); PartTimeStudent void Work(); 22

상속된객체와포인터, 참조 참조 (cont d) 프로그램예제 : 상속된객체와포인터 (2/2) int main() Person Person Person *p1 = new Person; *p2 = new Student; *p3 = new PartTimeStudent; p1->sleep(); p2->sleep(); p3->sleep(); return 0; Person *p3 = new PartTimeStudent; p3->sleep(); // p3->study(); // error // p3->work(); // error 23

상속된객체와포인터, 참조 객체참조 (Reference) 객체를참조할수있는레퍼런스 참조 (cont d) Person p; Person &r = p; Person 클래스의레퍼런스 (Person &) 는어떤대상체를가리키든지, Person 클래스내에선언된멤버와 Person 클래스가상속한클래스의멤버에만접근이가능하다. 24

상속된객체와포인터, 참조 참조 (cont d) 프로그램예제 : 상속된객체와참조 (1/2) #include <iostream> using std::cin; using std::cout; using std::endl; class Person void Sleep(void) cout << "Sleep!!!" << endl; class Student : public Person void Study(void) cout << "Study!!!" << endl; class PartTimeStudent : public Student void Work(void) cout << "Work!!!" << endl; Person void Sleep(); Student void Study(); PartTimeStudent void Work(); 25

상속된객체와포인터, 참조 참조 (cont d) 프로그램예제 : 상속된객체와레퍼런스 (2/2) int main() PartTimeStudent p; PartTimeStudent p; Person &r1 = p; Person &r1 = p; Student &r2 = p; r1.sleep(); PartTimeStudent &r3 = p; // r2.study(); // error r1.sleep(); r2.sleep(); r3.sleep(); // r3.work(); // error return 0; 26

함수재정의 (Overriding) 함수재정의 부모클래스에서선언된형태의함수를자식클래스에서다시 선언하는기능을제공 이전에정의된함수를숨기는 (hide) 특성을지닌다. class BaseClass BaseClass void Show(void) void Show(); cout << "BaseClass!!!" << endl; DerivedClass class DerivedClass : public BaseClass void Show(); void Show(void) cout << "DerivedClass!!!" << endl; 27

함수재정의 (cont d) 프로그램예제 : 함수재정의 -- overriding (1/2) #include <iostream> using std::cin; using std::cout; using std::endl; class BaseClass void Show(void) cout << "BaseClass!!!" << endl; class DerivedClass : public BaseClass void Show(void) cout << "DerivedClass!!!" << endl; int main(void) DerivedClass d; d.show(); return 0; 28

함수재정의 (cont d) Static Binding & Dynamic Binding 정적결합 (Static Binding) 호출할함수를컴파일하는과정 ( 컴파일 - 타임 ) 에서결정된다. 객체의이름과직접멤버접근연산자 () (.) 를사용하여 virtual 함수를호출 동적결합 (Dynamic Binding) 지연결합 (Late Binding) 호출할함수를실행하는과정 ( 런 - 타임 ) 에서결정된다. 포인터와참조를통해서만발생한다. 29

함수재정의 (cont d) 프로그램예제 : 함수재정의 -- overriding (1/2) #include <iostream> using std::cin; using std::cout; using std::endl; class BaseClass void Show(void) cout << "BaseClass!!!" << endl; class DerivedClass : public BaseClass void Show(void) cout << "DerivedClass!!!" << endl; 30

함수재정의 (cont d) 프로그램예제 : 함수재정의 -- overriding (2/2) int main(void) id) BaseClass B; B.Show(); DerivedClass D; D.Show(); DerivedClass *pd = new DerivedClass; pd->show(); BaseClass pb->show(); *pb = pd; delete pd; return 0; 31

가상함수 (virtual function) 가상함수 함수재정의 (Overriding) 된함수를가상으로선언할수있다. class BaseClass 가상함수의특성은상속된다. // 가상함수 virtual void Show(void) cout << "BaseClass!!!" << endl; class DerivedClass : public BaseClass void Show(void) // virtual void Show(void) cout << "DerivedClass!!!" << endl; 32

가상함수 (cont d) 함수재정의 (Overriding) 된함수호출 범위지정연산자 (::) 를통해서오버라이딩된함수도호출가능 class BaseClass virtual void Show(void) cout << "BaseClass!!!" << endl; class DerivedClass : public BaseClass void Show(void) BaseClass::Show(); cout << "DerivedClass!!!" << endl; 33

가상함수 (cont d) 프로그램예제 : 오버라이딩된함수호출 (1/2) #include <iostream> using std::cin; using std::cout; using std::endl; class BaseClass virtual void Show(void) cout << "BaseClass!!!" << endl; class DerivedClass : public BaseClass void Show(void) BaseClass::Show(); cout << "DerivedClass!!!" << endl; 34

가상함수 (cont d) 프로그램예제 : 오버라이딩된함수호출 (2/2) int main() BaseClass *pb = new DerivedClass; cout << "--------------------" << endl; pb->show(); cout << "--------------------" << endl; pb->baseclass::show(); return 0; 35

가상함수 (cont d) 순수가상함수 (pure virtual function) 함수원형만가지고있는함수 ( 함수내용이정의되지않은함수 ) 추상클래스 (abstract class) 하나이상의멤버함수가순수가상함수인클래스 추상클래스는객체를생성하지못한다!!! class BaseClass // 순수가상함수 virtual void Show(void) = 0; // = 0 : 순수지정자 class DerivedClass : public BaseClass void Show(void) cout << "DerivedClass!!!" << endl; 36

가상함수 (cont d) 프로그램예제 : virtual 소멸자 (1/3) #include <iostream> #include <cstring> using std::cin; using std::cout; using std::endl; class BaseClass char *id; BaseClass(char *id) this->id = new char[strlen(id)+1]; strcpy(this->id, id); virtual ~BaseClass(void) delete []id; // virtual 소멸자 virtual void Show(void) cout << "id : " << id << endl; 37

가상함수 (cont d) 프로그램예제 : virtual 소멸자 (2/3) class DerivedClass : public BaseClass char *name; DerivedClass(char *id, char *name) : BaseClass(id) this->name = new char[strlen(name)+1]; strcpy(this->name, name); ~DerivedClass(void) delete []name; void Show(void) cout << "name : " << name << endl; 38

가상함수 (cont d) 프로그램예제 : virtual 소멸자 (3/3) int main(void) id) BaseClass *pb = new DerivedClass("2011001", " 서두옥 "); DerivedClass *pd = new DerivedClass("2011005", " 홍길동 "); pb->show(); pd->show(); delete pb; delete pd; return 0; 39

다중상속 상속의이해 상속과다형성 다중상속 virtual 상속 40

다중상속 다중상속 하나의 Derived 클래스가둘이상의 Base 클래스를상속 Base Class #1 Base Class #2 Derived Class 41

다중상속 상속 (cont d) 프로그램예제 : 다중상속 (1/2) #include <iostream> using std::cin; using std::cout; using std::endl; class SuperClass void Show_SuperClass(void) SuperClass(void) cout << "Super Class!!!" << endl; class BaseClass void Show_BaseClass(void) cout << "Base Class!!!" << endl; 42

다중상속 상속 (cont d) 프로그램예제 : 다중상속 (2/2) class DerivedClass : public SuperClass, public BaseClass void Show_DerivedClass(void) cout << "Derived Class!!!" << endl; Show_SuperClass(); Show_BaseClass(); int main() DerivedClass d; d.show_derivedclass(); return 0; 43

다중상속의모호성 다중상속 상속 (cont d) class SuperClass void Show() cout << "Super Class!!!" << endl; class BaseClass void Show() cout << "Base Class!!!" << endl; class DerivedClass : public SuperClass, public BaseClass void Show_DerivedClass() cout << "Derived Class!!!" << endl; Show(); // error Show(); // error // 해결방법 SuperClass::Show(); BaseClass::Show(); 44

다중상속 다중상속의모호성 (cont d) 상속 (cont d) Derived 클래스가간접적인경로를통해서 Super Class 를두번상속 Super Class Base Class #1 Base Class #2 Derived Class 45

다중상속 상속 (cont d) class SuperClass void Show() cout << "Super Class!!!" << endl; class BaseClass01 : public SuperClass void Show01() cout << "Base Class #1!!!" << endl; class BaseClass02 : public SuperClass void Show02() cout << "Base Class #2!!!" << endl; class DerivedClass : public BaseClass02, public BaseClass01 void Show_DerivedClass() cout << "Derived Class!!!" << endl; Show(); // error Show01(); Show02(); 다중상속의모호성!!! 46

virtual 상속 virtual 상속 class SuperClass void Show() cout << "Super Class!!!" << endl; class BaseClass01 : virtual public SuperClass void Show01() cout << "Base Class #1!!!" << endl; class BaseClass02 : virtual public SuperClass void Show02() cout << "Base Class #2!!!" << endl; 47

virtual 상속 (cont d) 프로그램예제 : virtual 상속 (1/3) #include <iostream> using std::cin; using std::cout; using std::endl; class SuperClass void Show(void) cout << "Super Class!!!" << endl; 48

virtual 상속 (cont d) 프로그램예제 : virtual 상속 (2/3) class BaseClass01 : virtual public SuperClass void Show01(void) cout << "Base Class #1!!!" << endl; class BaseClass02 : virtual public SuperClass void Show02(void) cout << "Base Class #2!!!" << endl; 49

virtual 상속 (cont d) 프로그램예제 : virtual 상속 (3/3) class DerivedClass : public BaseClass02, public BaseClass01 void Show_DerivedClass(void) cout << "Derived Class!!!" << endl; Show(); Show01(); Show02(); int main(void) DerivedClass d; d.show_derivedclass(); return 0; 50

참고문헌 [1] 윤성우, 열혈강의 C++ 프로그래밍, 프리렉, 2007. [2] 이현창, 뇌를자극하는 C++ 프로그래밍, 한빛미디어, 2008. [3] H.M. HM Deitel, P. J. Deitel, C++ HOW TO PROGRAM : 6th Edition, Prentice Hall, 2009. [4] Wikipedie, http://www.wikipedia.org/. 이강의자료는저작권법에따라보호받는저작물이므로무단전제와무단복제를금지하며, 내용의전부또는일부를이용하려면반드시저작권자의서면동의를받아야합니다. Copyright Clickseo.com. All rights reserved. 51