상속과상속과다형성상속과다형성+_programming_inher… · 상속(inheritance)...

51
C++ Programming C++ Programming C++ Programming C++ Programming C++ Programming C++ Programming C++ Programming C++ Programming 상속과 상속과 다형성 다형성 상속과 상속과 다형성 다형성 Seo Seo, Doo , Doo-ok ok [email protected] [email protected] http://www.Clickseo.com http://www.Clickseo.com

Upload: others

Post on 20-Jul-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

C++ ProgrammingC++ ProgrammingC++ ProgrammingC++ ProgrammingC++ ProgrammingC++ ProgrammingC++ ProgrammingC++ Programming

상속과상속과 다형성다형성상속과상속과 다형성다형성

SeoSeo, Doo, Doo--okok

[email protected]@gmail.comhttp://www.Clickseo.comhttp://www.Clickseo.com

Page 2: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

목목 차차

상속의상속의 이해이해

상속과상속과 다형성다형성상속과상속과 다형성다형성

다중다중 상속상속다중다중 상속상속

2

Page 3: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속과상속과 다형성다형성상상 형성형성

객체의객체의 이해이해 객체의객체의 이해이해

상속 클래스의 객체의 생성 및 소멸상속 클래스의 객체의 생성 및 소멸

상속의 조건상속의 조건

상속과상속과 다형성다형성 상속과상속과 다형성다형성

다중다중 상속상속

3

Page 4: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속의상속의 이해이해상상

상속 (Inheritance)

클래스에 구현된 모든 특성(멤버 변수와 멤버 함수)을 그대로 계승 받아

새로운 클래스를 만드는 기능

기반클래스(B Cl ) S Cl• 기반클래스(Base Class) : Super Class

• 파생클래스(Derived class) : Sub Class

class DerivedClass : public BaseClass

{{

// 자동으로 기반 클래스의 멤버 변수와 함수를 소유

// 새로운 멤버 변수와 함수의 추가 가능

};

4

Page 5: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속의상속의 이해이해 (cont(cont’’d)d)상속의상속의 이해이해 (cont(cont d)d)

protected 멤버

파생된 클래스(상속 관계)에서만 접근을 허용하는 멤버

• 외부 접근 : private• 내부 접근 및 상속 관계 : publicp

class BaseClass{private:

int a;protected:

int b;};

int main(void)

{

BaseClass base;class DerivedClass : public BaseClass{public:

void SetData(void)

BaseClass base;

// 외부 접근

base.a = 10; // error{

a = 10; // errorb = 20; // 접근 가능

}}

ase a 0; // e obase.b = 20; // error

return 0;

5

};}

Page 6: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속의상속의 이해이해 (cont(cont’’d)d)상속의상속의 이해이해 (cont(cont d)d)

3가지 형태의 상속

Base 클래스의 멤버는 Derived 클래스로 상속되는 과정에서 접근

권한이 변경된다.

상속 형태

Base Classpublic 상속 protected 상속 private 상속

private 접근 불가 접근 불가 접근 불가

protected protected protected private

public public protected private

class DerivedClass : public BaseClassclass DerivedClass : public BaseClass

class DerivedClass : protected BaseClass

class DerivedClass : private BaseClass

6

Page 7: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속의상속의 이해이해 (cont(cont’’d)d)상속의상속의 이해이해 (cont(cont d)d)

프로그램 예제 : public 상속

#include <iostream>#include <iostream>

class BaseClass{private:

int a;protected:protected:

int b;public:

int c;};

class DerivedClass : public BaseClassclass DerivedClass : public BaseClass{public:

void SetData(void){

// a = 10; // errorb 20// ; //b = 20;c = 30;

}};

int main(void)int main(void){

DerivedClass c;

// c.a = 10; // error// c.b = 20; // errorc c = 30;

7

c.c = 30;return 0;

}

Page 8: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속상속 클래스의클래스의 객체객체 생성생성 및및 소멸소멸상상 생성생성

상속 클래스의 객체 생성 과정

1. 메모리 공간의 할당

2. Base 클래스의 생성자 실행 BaseClass

3. Derived 클래스의 생성자 실행

BaseClass

BaseClass();

DerivedClass

DerivedClass();

8

Page 9: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속상속 클래스의클래스의 객체객체 생성생성 및및 소멸소멸 (cont(cont’’d)d)

프로그램 예제 : 상속 클래스의 객체 생성 과정

#include <iostream>#include <iostream>

using std::cin;using std::cout;using std::endl;

class BaseClass{public:

BaseClass() { cout << "Base Class!!!" << endl; }BaseClass() { cout << Base Class!!! << endl; }};

class DerivedClass : public BaseClass{public:

DerivedClass() { cout << "DerivedClass Class!!!" << endl; }};

int main()int main(){

DerivedClass c;

9

return 0;}

Page 10: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속상속 클래스의클래스의 객체객체 생성생성 및및 소멸소멸 (cont(cont’’d)d)

프로그램 예제 : 상속과 객체 생성 과정 (1/3)

#include <iostream>Person

char name[12];

int age;

#include <iostream>#include <cstring>

using std::cin;using std::cout; Person();

const char GetName() const;

int GetAge() const;

using std::cout;using std::endl;

class Person{

Studentchar major[50];

{char name[12];int age;

public:Person(char *name = "" int age = 0) char major[50];

Student();

const char *GetMajor() const;

void ShowData() const;

Person(char *name = , int age = 0){

this->age = age;strcpy(this->name, name);

}}

const char *GetName(void) const { return name; }int GetAge(void) const { return age; }

};

10

};

Page 11: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속상속 클래스의클래스의 객체객체 생성생성 및및 소멸소멸 (cont(cont’’d)d)

프로그램 예제 : 상속과 객체 생성 과정 (2/3)

class Student : public Personclass Student : public Person{

char major[50];public:

Student(char *name, int age, char *major) : Person(name , age){

// this->age = age; // error// strcpy(this->name, name); // error// strcpy(this >name, name); // errorstrcpy(this->major, major);

}

t h *G tM j ( id) t { t j }const char *GetMajor(void) const { return major; }

void ShowData(void) const{

cout << "이름 : " << GetName() << endl;cout << "나이 : " << GetAge() << endl;cout << "전공 : " << GetMajor() << endl;

}

11

}};

Page 12: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속상속 클래스의클래스의 객체객체 생성생성 및및 소멸소멸 (cont(cont’’d)d)

프로그램 예제 : 상속과 객체 생성 과정 (3/3)

i t i ()int main()

{

Student s("Seo, Doo-ok", 20, "Computer");

s.ShowData();

return 0;return 0;

}

12

Page 13: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속상속 클래스의클래스의 객체객체 생성생성 및및 소멸소멸 (cont(cont’’d)d)

상속 클래스의 객체 소멸 과정

1. Derived 클래스의 소멸자 실행

2. Base 클래스의 소멸자 실행

BaseClass

BaseClass();

~BaseClass();

DerivedClass

DerivedClass();

~DerivedClass();

13

Page 14: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속상속 클래스의클래스의 객체객체 생성생성 및및 소멸소멸 (cont(cont’’d)d)

프로그램 예제 : 상속 클래스의 객체 소멸 과정

#include <iostream>#include <iostream>

using std::cin;using std::cout;using std::endl;

class BaseClass{public:

BaseClass() { cout << "Base Class!!!" << endl; }BaseClass() { cout << Base Class!!! << endl; }~BaseClass() { cout << "~Base Class!!!" << endl; }

};

class DerivedClass : public BaseClassp{public:

DerivedClass() { cout << "DerivedClass Class!!!" << endl; }~DerivedClass() { cout << "~DerivedClass Class!!!" << endl; }

};};int main(){

DerivedClass c;

14

return 0;}

Page 15: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속의상속의 조건조건상상

IS-A 관계에 의한 상속 “A student is a person”“학생은 (일종의) 사람이다 ” “~은 ~이다”가 성립하는 관계 “학생은 (일종의) 사람이다.”

Person

Student

불성립 성립

Student

class Student : public Person

15

Page 16: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속의상속의 조건조건 (cont(cont’’d)d)상상

IS-A 관계에 의한 상속 (cont’d)

잘못된 상속 구조

Student

Person

성립 불성립

Person

class Person : public Student

16

Page 17: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속의상속의 조건조건 (cont(cont’’d)d)상상

HAS-A(HAVE-A) 관계에 의한 상속 : 포함 관계

하나의 클래스가 다른 클래스의 객체를 멤버로 가지고 있을 경우

CudgelCudgel

HAS-A 관계

“The police have a Cudgel.”“경찰은 몽둥이를 소유한다.”

Police

17

Page 18: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속의상속의 조건조건 (cont(cont’’d)d)상상

HAS-A(HAVE-A) 관계에 의한 상속 (cont’d)

클래스 객체 멤버

class Cudgel{{public:

void Swing(void){

cout << "Swing a cudgel1!!" << endl;cout << Swing a cudgel1!! << endl;}

};

class Policeclass Police{

Cudgel c; // 객체 멤버public:

void Useweapon(void)void Useweapon(void){

c.Swing();}

};

18

};

Page 19: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속의상속의 조건조건 (cont(cont’’d)d)상상프로그램 예제 : HAS-A관계에 의한 상속

#include <iostream>#include <iostream>

using std::cin;using std::cout;using std::endl;

class Cudgelclass Cudgel{public:

void Swing(void){

cout << "Swing a cudgel!!!" << endl;}

Cudgel

}};

class Police{

Cudgel c;void Swing();

g ;public:

void Useweapon(void){

c.Swing();}

};Student

Cudgel c;void Useweapon();

};

int main(){

Police p;p Useweapon();

19

p.Useweapon();return 0;

}

Page 20: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속과상속과 다형성다형성상상 형성형성

상속의상속의 이해이해

상속과상속과 다형성다형성

상속된 객체와 포인터, 참조

함수 재정의

가상 함수가상 함수

다중다중 상속상속 다중다중 상속상속

20

Page 21: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속된상속된 객체와객체와 포인터포인터, , 참조참조상상 ,,

객체 포인터

객체의 주소 값을 저장할 수 있는 포인터

Person *p = new Person;

Person *p = new Student;

Person *p = new PartTimeStudent;

“Person 클래스의 객체 포인터(Person *)는 어떤 대상체를 가리키든지,

Person 클래스 내에 선언된 멤버와

Person 클래스가 상속한 클래스의 멤버에만 접근이 가능하다.”

21

Page 22: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속된상속된 객체와객체와 포인터포인터, , 참조참조 (cont(cont’’d)d)상상 ,,프로그램 예제 : 상속된 객체와 포인터 (1/2)

#include <iostream>

Person

void Sleep();

#include <iostream>

using std::cin;using std::cout;using std::endl;

class Person p();

Student

class Person{public:

void Sleep(void){

cout << "Sleep!!!" << endl;}

void Study();

}};

class Student : public Person{public:

PartTimeStudent

void Work();

pvoid Study(void){

cout << "Study!!!" << endl;}

};();

class PartTimeStudent : public Student{public:

void Work(void){

cout << "Work!!!" << endl;

22

cout << Work!!! << endl;}

};

Page 23: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속된상속된 객체와객체와 포인터포인터, , 참조참조 (cont(cont’’d)d)상상 ,,프로그램 예제 : 상속된 객체와 포인터 (2/2)

int main()int main(){

Person *p1 = new Person;Person *p2 = new Student;

Person *p3 = new PartTimeStudent;

Person *p3 = new PartTimeStudent;

p1->Sleep();p2->Sleep();

p3->Sleep();// p3->Study(); // error

p2 >Sleep();p3->Sleep();

return 0;} // p3->Work(); // error}

23

Page 24: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속된상속된 객체와객체와 포인터포인터, , 참조참조 (cont(cont’’d)d)상상 ,,

객체 참조 (Reference)

객체를 참조할 수 있는 레퍼런스

Person p;

Person &r = p;

“Person 클래스의 레퍼런스(Person &)는 어떤 대상체를 가리키든지,

Person 클래스 내에 선언된 멤버와

Person 클래스가 상속한 클래스의 멤버에만 접근이 가능하다.”

24

Page 25: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속된상속된 객체와객체와 포인터포인터, , 참조참조 (cont(cont’’d)d)상상 ,,프로그램 예제 : 상속된 객체와 참조 (1/2)

#include <iostream>

Person

void Sleep();

#include <iostream>

using std::cin;using std::cout;using std::endl;

class Person p();

Student

class Person{public:

void Sleep(void){

cout << "Sleep!!!" << endl;}

void Study();

}};

class Student : public Person{public:

PartTimeStudent

void Work();

pvoid Study(void){

cout << "Study!!!" << endl;}

};();

class PartTimeStudent : public Student{public:

void Work(void){

cout << "Work!!!" << endl;

25

cout << Work!!! << endl;}

};

Page 26: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

상속된상속된 객체와객체와 포인터포인터, , 참조참조 (cont(cont’’d)d)상상 ,,프로그램 예제 : 상속된 객체와 레퍼런스 (2/2)

i t i () PartTimeStudent p;

Person &r1 = p;

int main(){

PartTimeStudent p;

r1.Sleep();// r2.Study(); // error

Person &r1 = p;Student &r2 = p;PartTimeStudent &r3 = p; y()

// r3.Work(); // errorr1.Sleep();r2.Sleep();r3 Sleep();r3.Sleep();

return 0;}}

26

Page 27: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

함수함수 재정의재정의정정

함수 재정의 (Overriding)

부모 클래스에서 선언된 형태의 함수를 자식 클래스에서 다시

선언하는 기능을 제공

이전에 정의된 함수를 숨기는(hid ) 특성을 지닌다• 이전에 정의된 함수를 숨기는(hide) 특성을 지닌다.

class BaseClass{public:

BaseClass

void Show();public:void Show(void){

cout << "BaseClass!!!" << endl;}

void Show();

};

class DerivedClass : public BaseClass{public:

DerivedClass

void Show();public:void Show(void){

cout << "DerivedClass!!!" << endl;}

27

};

Page 28: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

함수함수 재정의재정의 (cont(cont’’d)d)정정프로그램 예제 : 함수 재정의 -- overriding (1/2)

#include <iostream>#include <iostream>

using std::cin;using std::cout;using std::endl;

class BaseClassclass BaseClass{public:

void Show(void){

cout << "BaseClass!!!" << endl;}}

};

class DerivedClass : public BaseClass{public:

id Sh ( id)p

void Show(void){

cout << "DerivedClass!!!" << endl;}

};

int main(void){

DerivedClass d;d.Show();

28

return 0;}

Page 29: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

함수함수 재정의재정의 (cont(cont’’d)d)정정

Static Binding & Dynamic Binding

정적 결합 (Static Binding)

• 호출할 함수를 컴파일 하는 과정(컴파일-타임)에서 결정된다.

• 객체의 이름과 직접 멤버 접근 연산자( )를 사용하여 virtual 함수를 호출• 객체의 이름과 직접 멤버 접근 연산자(.)를 사용하여 virtual 함수를 호출

동적 결합 (Dynamic Binding)적 ( y g)

• 지연 결합 (Late Binding)

• 호출할 함수를 실행하는 과정(런-타임)에서 결정된다.

• 포인터와 참조를 통해서만 발생한다.

29

Page 30: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

함수함수 재정의재정의 (cont(cont’’d)d)정정프로그램 예제 : 함수 재정의 -- overriding (1/2)

#include <iostream>#include <iostream>

using std::cin;using std::cout;using std::endl;

class BaseClass{public:

void Show(void)void Show(void){

cout << "BaseClass!!!" << endl;}

};

class DerivedClass : public BaseClass{public:

void Show(void)void Show(void){

cout << "DerivedClass!!!" << endl;}

};

30

}

Page 31: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

함수함수 재정의재정의 (cont(cont’’d)d)정정프로그램 예제 : 함수 재정의 -- overriding (2/2)

i t i ( id)int main(void){

BaseClass B;B.Show();B.Show();

DerivedClass D;D.Show();

DerivedClass *pD = new DerivedClass;pD->Show();

BaseClass *pB = pD;pB->Show();

delete pD;

return 0;

31

}

Page 32: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

가상가상 함수함수상상

가상 함수 (virtual function)

함수 재정의(Overriding)된 함수를 가상으로 선언할 수 있다.

class BaseClass{

“가상 함수의 특성은 상속된다.”{public:

// 가상 함수virtual void Show(void){{

cout << "BaseClass!!!" << endl;}

};

class DerivedClass : public BaseClass{public:

void Show(void) // virtual void Show(void)void Show(void) // virtual void Show(void){

cout << "DerivedClass!!!" << endl;}

};

32

};

Page 33: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

가상가상 함수함수 (cont(cont’’d)d)상상

함수 재정의(Overriding)된 함수 호출

범위 지정 연산자(::)를 통해서 오버라이딩 된 함수도 호출 가능

class BaseClass{{public:

virtual void Show(void){

cout << "BaseClass!!!" << endl;cout << BaseClass!!! << endl;}

};

class DerivedClass : public BaseClassclass DerivedClass : public BaseClass{public:

void Show(void){{

BaseClass::Show();cout << "DerivedClass!!!" << endl;

}};

33

};

Page 34: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

가상가상 함수함수 (cont(cont’’d)d)상상프로그램 예제 : 오버라이딩 된 함수 호출 (1/2)

#include <iostream>#include <iostream>

using std::cin;using std::cout;using std::endl;

class BaseClass{public:

virtual void Show(void)virtual void Show(void){

cout << "BaseClass!!!" << endl;}

};

class DerivedClass : public BaseClass{public:

void Show(void)void Show(void){

BaseClass::Show();cout << "DerivedClass!!!" << endl;

}

34

}};

Page 35: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

가상가상 함수함수 (cont(cont’’d)d)상상프로그램 예제 : 오버라이딩된 함수 호출 (2/2)

i t i ()int main()

{

BaseClass *pB = new DerivedClass;

cout << "--------------------" << endl;

pB->Show();

cout << "--------------------" << endl;

pB->BaseClass::Show();

return 0;

}

35

Page 36: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

가상가상 함수함수 (cont(cont’’d)d)상상

순수 가상 함수 (pure virtual function)

수 수 함수 원형만 가지고 있는 함수 (함수 내용이 정의되지 않은 함수)

추상 클래스 (abstract class)

• 하나 이상의 멤버 함수가 순수 가상 함수인 클래스• 하나 이상의 멤버 함수가 순수 가상 함수인 클래스

• 추상 클래스는 객체를 생성하지 못한다!!!

class BaseClass{public:

// 순수 가상 함수virtual void Show(void) = 0; // = 0 : 순수 지정자

};};

class DerivedClass : public BaseClass{public:p

void Show(void){

cout << "DerivedClass!!!" << endl;}

}

36

};

Page 37: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

가상가상 함수함수 (cont(cont’’d)d)상상프로그램 예제 : virtual 소멸자 (1/3)

#include <iostream>#include <iostream>#include <cstring>

using std::cin;using std::cout;using std::endl;using std::endl;

class BaseClass{

char *id;public:public:

BaseClass(char *id){

this->id = new char[strlen(id)+1];strcpy(this->id, id);

}}

virtual ~BaseClass(void) // virtual 소멸자{

delete []id;}}

virtual void Show(void){

cout << "id : " << id << endl;}

37

}};

Page 38: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

가상가상 함수함수 (cont(cont’’d)d)상상프로그램 예제 : virtual 소멸자 (2/3)

class DerivedClass : public BaseClassclass DerivedClass : public BaseClass{

char *name;public:

DerivedClass(char *id, char *name) : BaseClass(id){

this->name = new char[strlen(name)+1];strcpy(this->name, name);strcpy(this >name, name);

}

~DerivedClass(void){{

delete []name;}

void Show(void){

cout << "name : " << name << endl;}

38

}};

Page 39: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

가상가상 함수함수 (cont(cont’’d)d)상상프로그램 예제 : virtual 소멸자 (3/3)

i t i ( id)int main(void)

{

BaseClass *pB = new DerivedClass("2011001", "서두옥");DerivedClass *pD = new DerivedClass("2011005" "홍길동");DerivedClass *pD = new DerivedClass( 2011005 , 홍길동 );

pB->Show();

pD->Show();pD->Show();

delete pB;delete pD;delete pD;

return 0;

}}

39

Page 40: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

다중다중 상속상속중중 상상

상속의상속의 이해이해 상속의상속의 이해이해

상속과상속과 다형성다형성

다중다중 상속상속 다중다중 상속상속

virtual 상속

40

Page 41: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

다중다중 상속상속중중 상상

다중 상속

하나의 Derived 클래스가 둘 이상의 Base 클래스를 상속

Base Class #1 Base Class #2

Derived Class

41

Page 42: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

다중다중 상속상속 (cont(cont’’d)d)중중 상상프로그램 예제 : 다중 상속 (1/2)

#include <iostream>#include <iostream>

using std::cin;using std::cout;using std::endl;

class SuperClass{public:

void Show SuperClass(void)void Show_SuperClass(void){

cout << "Super Class!!!" << endl;}

};

class BaseClass{public:

void Show BaseClass(void)void Show_BaseClass(void){

cout << "Base Class!!!" << endl;}

};

42

}

Page 43: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

다중다중 상속상속 (cont(cont’’d)d)중중 상상프로그램 예제 : 다중 상속 (2/2)

class DerivedClass : public SuperClass public BaseClassclass DerivedClass : public SuperClass, public BaseClass{public:

void Show_DerivedClass(void){

cout << "Derived Class!!!" << endl;Show_SuperClass();Show BaseClass();Show_BaseClass();

}};

i t i ()int main(){

DerivedClass d;

d.Show_DerivedClass();

return 0;}

43

}

Page 44: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

다중다중 상속상속 (cont(cont’’d)d)중중 상상

다중 상속의 모호성

class SuperClass{public:

void Show() { cout << "Super Class!!!" << endl; }}};

class BaseClass{public:p

void Show() { cout << "Base Class!!!" << endl; }};

class DerivedClass : public SuperClass, public BaseClass{{public:

void Show_DerivedClass(){

cout << "Derived Class!!!" << endl;cout << Derived Class!!! << endl;Show(); // errorShow(); // error

}};

// 해결 방법

SuperClass::Show();BaseClass::Show();

44

BaseClass::Show();

Page 45: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

다중다중 상속상속 (cont(cont’’d)d)중중 상상

다중 상속의 모호성 (cont’d)

Derived 클래스가 간접적인 경로를 통해서 Super Class를 두 번 상속

S ClSuper Class

Base Class #1 Base Class #2

Derived Class

45

Page 46: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

다중다중 상속상속 (cont(cont’’d)d)중중 상상class SuperClass{public:

void Show() { cout << "Super Class!!!" << endl; }};

class BaseClass01 : public SuperClass{public:

#void Show01() { cout << "Base Class #1 !!!" << endl; }};

class BaseClass02 : public SuperClass{public:

void Show02() { cout << "Base Class #2 !!!" << endl; }};

class DerivedClass : public BaseClass02, public BaseClass01{{public:

void Show_DerivedClass(){

cout << "Derived Class!!!" << endl;Sh () //Show(); // errorShow01();Show02();

}};

다중 상속의 모호성!!!

46

다중 상속의 모호성!!!

Page 47: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

virtual virtual 상속상속상상

virtual 상속

class SuperClass{public:

void Show() { cout << "Super Class!!!" << endl; }};

class BaseClass01 : virtual public SuperClassclass BaseClass01 : virtual public SuperClass{public:

void Show01() { cout << "Base Class #1 !!!" << endl; }};

class BaseClass02 : virtual public SuperClass{public:

void Show02() { cout << "Base Class #2 !!!" << endl; }};

47

};

Page 48: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

virtual virtual 상속상속 (cont(cont’’d)d)상상프로그램 예제 : virtual 상속 (1/3)

#i l d <i t >#include <iostream>

using std::cin;using std::cout;using std::cout;using std::endl;

class SuperClass{public:

void Show(void){{

cout << "Super Class!!!" << endl;}

};};

48

Page 49: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

virtual virtual 상속상속 (cont(cont’’d)d)상상프로그램 예제 : virtual 상속 (2/3)

class BaseClass01 : virtual public SuperClassclass BaseClass01 : virtual public SuperClass{public:

void Show01(void)void Show01(void){

cout << "Base Class #1 !!!" << endl;}

};

class BaseClass02 : virtual public SuperClass{{public:

void Show02(void){{

cout << "Base Class #2 !!!" << endl;}

};

49

Page 50: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

virtual virtual 상속상속 (cont(cont’’d)d)상상프로그램 예제 : virtual 상속 (3/3)

class DerivedClass : public BaseClass02 public BaseClass01class DerivedClass : public BaseClass02, public BaseClass01{public:

void Show_DerivedClass(void){

cout << "Derived Class!!!" << endl;Show();Show01();Show01();Show02();

}};

int main(void){

DerivedClass d;

d.Show_DerivedClass();

return 0;

50

return 0;}

Page 51: 상속과상속과다형성상속과다형성+_Programming_Inher… · 상속(Inheritance) 클래스에구현된모든특성(멤버변수와멤버함수)을그대로계승받아 새로운클래스를만드는기능

참고문헌참고문헌[1] 윤성우, “열혈강의 C++ 프로그래밍”, 프리렉, 2007.

[2] 이현창, “뇌를 자극하는 C++ 프로그래밍”, 한빛미디어, 2008.

[3] H M D it l P J D it l “C HOW TO PROGRAM 6th Editi ” P ti H ll 2009[3] H.M. Deitel, P. J. Deitel, “C++ HOW TO PROGRAM : 6th Edition”, Prentice Hall, 2009.

[4] Wikipedie, http://www.wikipedia.org/.

이 강의자료는 저작권법에 따라 보호받는 저작물이므로 무단 전제와 무단 복제를 금지하며,

내용의 전부 또는 일부를 이용하려면 반드시 저작권자의 서면 동의를 받아야 합니다.

C i ht © Cli k All i ht d

51

Copyright © Clickseo.com. All rights reserved.