36
8.상속과 다형성 (polymorphism) (polymorphism) 상속된 객체와 포인터/참조자의 관계 정적 바인딩과 동적 바인딩 virtual 소멸자 Jong Hyuk Park

additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

8.상속과 다형성(polymorphism)(polymorphism)

상속된 객체와 포인터/참조자의 관계

정적 바인딩과 동적 바인딩

virtual 소멸자

Jong Hyuk Park

Page 2: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

상속의 조건

public 상속은 is-a 관계가 성립되도록 하자.

일반화일반화

ParttimeStd 구체화

2C++ Programming

Page 3: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

상속의 조건

잘못된 상속의 예

현실세계와완전히동떨어진모델이형성됨

3C++ Programming

Page 4: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

상속의 조건

HAS-A(소유) 관계에 의한 상속!• 경찰은 몽둥이를 소유한다

• The Police have a cudgelThe Police have a cudgel.

• 상속은 소유를 표현하기 위해서도 사용함

4C++ Programming

Page 5: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

예제1#include <iostream>#include <iostream>using std::endl;using std::cout;

class Cudgel //몽둥이{ public:public:

void Swing(){ cout<<"Swing a cudgel!"<<endl; }};

int main(){

Police pol;};

class Police : public Cudgel //몽둥이를소유하는경찰

Police pol;pol.UseWeapon();

return 0;{public:

void UseWeapon(){ Swing(); }

return 0;}

}; Police is a Cudgel (X)Police has a Cudgel (O)

Page 6: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

상속의 조건

HAS-A에 의한 상속 그리고 대안!• 포함 관계를 통해서 소유 관계를 표현

• 객체 멤버에 의한 포함 관계의 형성 – 예제2객체 멤버에 의한 포함 관계의 형성 예제2

• 객체 포인터 멤버에 의한 포함 관계의 형성 – 예제3

6C++ Programming

Page 7: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

상속의 조건/* 예제2 */class Cudgel //몽둥이{{ public:

void Swing(){ cout<<"Swing a cudgel!"<<endl; }};};class Police //몽둥이를 소유하는 경찰{

Cudgel cud; // 클래스 객체멤버 or 객체 멤버public:

void UseWeapon(){ cud.Swing(); }};

int main(){

Police pol;pol.UseWeapon();return 0;

}}

7C++ Programming

Page 8: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

상속의 조건/* 예제3 */class Cudgel //몽둥이{ public:

void Swing(){ cout<<"Swing a cudgel!"<<endl; }};class Police //몽둥이를 소유하는 경찰{

Cudgel* cud;public:

Police(){ cud=new Cudgel; }~Police(){ delete cud; }

id U W (){ d S i () }void UseWeapon(){ cud->Swing(); }};int main(){{

Police pol;pol.UseWeapon();return 0;return 0;

}

8C++ Programming

Page 9: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

상속된 객체와포인터/참조자의 관계포인터/참조자의 관계

Jong Hyuk Park

Page 10: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

상속된 객체와 포인터 관계

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

AAA 클래스의 포인터는 AAA 객체의 주소 뿐만 아니라클래 의 인터는 객체의 주 뿐만 아니라AAA 클래스를 상속하는 Derived 클래스의 객체의 주소값도 저장 가능AAA 클래스의 참 자는 AAA 객체 뿐만 아니라 AAAAAA 클래스의 참조자는 AAA 객체 뿐만 아니라 AAA 클래스를 상속하는 Derived 클래스의 객체 도 참조 가능

10C++ Programming

Page 11: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

객체의 포인터 예#i l d i t

CPointer1.cpp#include <iostream>

using std::endl;

using std::cout;

class Person

int main(void)

{

Person* p1=new Person;

P * 2 St d t{

public:

void Sleep(){

cout<<"Sleep"<<endl;

Person* p2=new Student;

Person* p3=new PartTimeStd;

p1 >Sleep();cout<< Sleep <<endl;

}

};

class Student : public Person

p1->Sleep();

p2->Sleep();

p3->Sleep();int main(void)

{

public:

void Study(){

cout<<"Study"<<endl;

return 0;

}

{

Person* p1=new PartTimeStd;

Student* p2=new PartTimeStd;

P tTi Std * 3 P tTi Stdy ;

}

};

class PartTimeStd : public Student

{

PartTimeStd * p3=new PartTimeStd;

p1->Sleep();

p2 >Sleep();{

public:

void Work(){

cout<<"Work"<<endl;

p2->Sleep();

p3->Sleep();

return 0;}

};

return 0;

}

11C++ Programming

Page 12: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

상속된 객체의 포인터,참조자

객체 포인터의 권한포인터를 통해서 접근할 수 있는 객체 멤버의 영역

래 의 객체 인터 래 의 멤버와AAA 클래스의 객체 포인터는 AAA 클래스의 멤버와 AAA 클래스가 상속받은 Base 클래스의 멤버만 접근 가능AAA 클래스의 참조자는 AAA 클래스의 멤버와 AAAAAA 클래스의 참조자는 AAA 클래스의 멤버와 AAA 클래스가 상속받은 Base 클래스의 멤버만 접근 가능

12C++ Programming

Page 13: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

객체 포인터의 권한 예CPointer2 cpp

#include <iostream>using std::endl;using std::cout;

CPointer2.cpp

g ;

class Person{public:

id Sl (){

i i id

void Sleep(){ cout<<"Sleep"<<endl;

}};

int main(void){

Person* p3=new PartTimeStd;

3 Sl ()

class Student : public Person{public:

void Study(){t "St d " dl p3->Sleep();

p3->Study(); // ! 에러p3->Work(); // ! 에러

0

cout<<"Study"<<endl;}

};

class PartTimeStd : public Student return 0;}

class PartTimeStd : public Student{public:

void Work(){cout<<"Work"<<endl;

}}};

13C++ Programming

Page 14: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

상속된 객체와 참조 관계

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

래 인터의 성과 일치클래스 포인터의 특성과 일치CReference1. cpp

객체 레퍼런스의 권한객체를 참조하는 레퍼런스의 권한객체를 참조하는 레퍼런스의 권한클래스 포인터의 권한과 일치CReference2 cppCReference2. cpp

14C++ Programming

Page 15: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

객체의 참조자 예CReference1. cpp

#include <iostream>

using std::endl;

using std::cout;

class Person

pp

class Person

{

public:

void Sleep(){

cout<<"Sleep"<<endl;

}

};

class Student : public Personint main(void)

p

{

public:

void Study(){

cout<<"Study"<<endl;

{

PartTimeStd p;

Student& ref1=p;

P & f2cout<< Study <<endl;

}

};

class PartTimeStd : public Student

Person & ref2=p;

p.Sleep();

ref1 Sleep();{

public:

void Work(){

cout<<"Work"<<endl;

ref1.Sleep();

ref2.Sleep();

return 0;cout<< Work <<endl;

}

};

return 0;

}

15C++ Programming

Page 16: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

객체 참조자의 권한 예CReference2 cpp

#include <iostream>using std::endl;using std::cout;

CReference2. cpp

class Person{public:

void Sleep(){void Sleep(){ cout<<"Sleep"<<endl;

}};

class Student : public Person

int main(void)

class Student : public Person{public:

void Study(){cout<<"Study"<<endl; int main(void)

{PartTimeStd p;Person& ref=p;

ref Sleep();

}};

class PartTimeStd : public Student{ ref.Sleep();

ref.Study(); // ! 에러ref.Work(); // ! 에러

return 0;

{public:

void Work(){cout<<"Work"<<endl;

}}; }};

16C++ Programming

Page 17: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

정적 바인딩과동적 바인딩동적 바인딩

Jong Hyuk Park

Page 18: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

오버라이딩(overriding)

오버라이딩(Overriding)의 이해• Base 클래스에 선언된 멤버와 같은 형태의 멤버를 Derived

클래스에서 선언

• Base 클래스의 멤버를 가리는 효과!

• 보는 시야(Pointer)에 따라서 달라지는 효과!

O idi 1 O idi 2• Overriding1.cpp, Overriding2.cpp

C++ Programming18

Page 19: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

오버라이딩(overriding)

베이스 클래스에서 선언된 함수를 파생 클래스에서 다시 선언O idi 1

#include <iostream>using std::endl;using std::cout;

int main(void)

{

Overriding1.cpp

class AAA{public:

BBB b;

b.fct();public:void fct(){cout<<"AAA"<<endl;}

}

return 0;

}};

class BBB : public AAA{

}

BBB

public:void fct(){cout<<"BBB"<<endl;}

C++ Programming19

}};

Page 20: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

오버라이딩 예

#include <iostream>using std::endl;

Overriding2.cpp

using std::cout;

class AAA{

int main(void)

{{public:

void fct(){cout<<"AAA"<<endl;}

BBB* b=new BBB;

b->fct();

}};

class BBB : public AAA

AAA* a=b;

a->fct();

{public:

void fct(){cout<<"BBB"<<endl;

delete b;

return 0;;}

};}

BBBAAA

20C++ Programming

Page 21: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

가상함수(virtual function)

멤버함수를 가상(virtual)로 선언오버라이딩 되는 경우의 특징은? - Overriding3.cpp

i l의 특성 상속된다Virtual의 특성도 상속된다. - Overriding4.cpp

C++ Programming21

Page 22: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

가상함수 예

#include <iostream>using std::endl; int main(void)

{

Overriding3.cpp

gusing std::cout;

class AAA{

{BBB* b=new BBB;b->fct();

{public:

virtual void fct(){ // 가상함수cout<<"AAA"<<endl;}

AAA* a=b;a->fct();

delete b;}};

class BBB : public AAA

delete b;return 0;

}

p{public:

void fct(){cout<<"BBB"<<endl;

BBBBBB

cout<< BBB <<endl;}

};

22C++ Programming

Page 23: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

가상함수 특성 상속 예Overriding4 cpp#include <iostream>using std::endl;using std::cout;

Overriding4.cpp

class AAA{public:

i i ( id)virtual void fct(){ // 가상함수cout<<"AAA"<<endl;}

};

int main(void){

BBB* b=new BBB;b->fct();

class BBB : public AAA{public:

void fct(){ // virtual void fct()

AAA* a=b;a->fct();

(){ ()cout<<"BBB"<<endl;}

};class CCC : public BBB

delete b;return 0;

}

p{public:

void fct(){cout<<"CCC"<<endl;

CCCCCC

cout<< CCC <<endl;}

};

23C++ Programming

Page 24: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

바인딩(binding)과 다형성

바인딩정적 바인딩(static binding)• 컴파일 시(compile-time) 호출되는 함수를 결정

동적 바인딩(d i bi di )동적 바인딩(dynamic binding)• 실행 시(run-time) 호출되는 함수를 결정

오버라이딩된 함수의 호출Overriding5.cppOverriding5.cpp

C++ Programming24

Page 25: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

바인딩 예

#include <iostream>using std::endl;using std::cout; int main(void)g ;

class AAA{public:

int main(void){

BBB b;b.fct(); // 정적 바인딩

public:virtual void fct(){ // 가상함수cout<<"AAA"<<endl;}

};

AAA* a=new BBB;a->fct(); // 동적 바인딩

delete b;};

class BBB : public AAA{public:

delete b;return 0;

}`

public:void fct(){ cout<<"BBB"<<endl;}

};

BBBBBB

};

25C++ Programming

Page 26: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

오버라이딩된 함수 호출 예

#include <iostream>#include <iostream>using std::endl;using std::cout;

class AAA

int main(void){

AAA* a=new BBB;class AAA{public:

virtual void fct(){cout<<"AAA"<<endl;

cout<<"첫 번째 시도"<<endl;a->fct();

t<<"두 번째 시도"<< dlcout<< AAA <<endl;}

};

l BBB bli AAA

cout<<"두 번째 시도"<<endl;a->AAA::fct(); // 방법 2.

return 0;}class BBB : public AAA

{public:

void fct(){AAA f () // 방법 1

}

첫 번째 시도AAABBBAAA::fct(); // 방법 1.

cout<<"BBB"<<endl;}

};

BBB두 번째 시도AAA

26C++ Programming

Page 27: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

바인딩(binding)과 다형성

다형성 l hi다형성(polymorphism)같은 모습의 형태가 다른 특성

f t() 예a->fct() 예• a라는 포인터(모습)가 가리키는 대상에 따라 호출되는

함수(형태)가 다름함수(형태)가 다름

함수 오버로딩, 동적 바인딩 등이 다형성의 예

C++ Programming27

Page 28: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

순수 가상함수

순수 가상함수(pure virtual function) 베이스 클래스에서는 어떤 동작도 정의되지 않고베이스 클래스에서는 어떤 동작도 정의되지 않고함수의 선언 만을 하는 가상함수

순수 가상함수를 선언하고 파생 클래스에서 이 가상함수를 중복정의하지 않으면 컴파일 시에 에러가 발생

하나 이상의 멤버가 순수 가상함수인 클래스를 추상클래스(abstract class)라 함

완성된 클래스가 아니기 때문에 객체화되지 않는 클래스• 완성된 클래스가 아니기 때문에 객체화되지 않는 클래스

베이스 클래스에서 다음과 같은 형식으로 선언

virtual 자료형 함수명(인수 리스트) = 0;

C++ Programming28

Page 29: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

순수 가상 함수 예 (1)#include <iostream>using std::endl;using std::cout;class Date { // 베이스 클래스

void Bdate::print()protected:`

int year,month,day;public:

Date(int y,int m,int d)

void Bdate::print(){

static char *mn[] = {"Jan.", "Feb.", "Mar.", "Apr.", "May", "June" "July" "Aug " "Sep " "Oct "

{ year = y; month = m; day = d; }virtual void print() = 0; // 순수 가상함수

};class Adate : public Date {

June , July , Aug. , Sep. , Oct. , "Nov.","Dec." };

cout << mn[month-1] << ' ' << day << ' ' << year << '\n';

}// 파생 클래스 Adate

public:Adate(int y,int m,int d) : Date(y,m,d)

{ /* no operation */ }

}

int main(){

Ad t (1994 6 1){ p }

void print() // 가상함수{ cout << year << '.' << month << '.' << day << ".\n"; }

};class Bdate : public Date {

Adate a(1994,6,1);Bdate b(1945,8,15);Date &r1 = a, &r2 = b; // 참조자r1.print();

ip {

// 파생 클래스 Bdatepublic:

Bdate(int y,int m,int d) : Date(y,m,d) { /* no operation */ }

r2.print();return 0;

}

1994 6 1{ / no operation / }void print(); // 가상함수

};

1994.6.1.Aug. 15 1945

29C++ Programming

Page 30: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

virtual 소멸자virtual 소멸자

Jong Hyuk Park

Page 31: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

virtual 소멸자

파생클래스를 가리키는 베이스클래스의 포인터가가리키는 객체의 소멸 시에는 파생 클래스의 소멸자를가리키는 객체의 소멸 시에는 파생 클래스의 소멸자를호출하지 않음

virtual 소멸자객체 소멸 시 베이스클래스 뿐만 아니라 파생클래스의객체 소멸 시 베이스클래스 뿐만 아니라 파생클래스의소멸자도 호출소멸자 앞에 virtual 키워드소멸자 앞에 virtual 키워드

C++ Programming31

Page 32: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

virtual 소멸자 필요성 예l d#include <iostream>

using std::endl;

using std::cout;

class AAA

{

~BBB(){

cout<<"~BBB() call!"<<endl;

delete []str2;

}{

char* str1;

public:

AAA(char* _str1){

t 1 h [ t l ( t 1) 1]

virtual void ShowString(){

AAA::ShowString();

cout<<str2<<endl;

}str1= new char[strlen(_str1)+1];

strcpy(str1, _str1);

}

~AAA(){

cout<<" AAA() call!"<<endl;

};

int main()

{

AAA * a=new BBB("Good", "evening");cout<< ~AAA() call! <<endl;

delete []str1;

}

virtual void ShowString(){

cout<<str1<<' ';

BBB * b=new BBB("Good", "morning");

a->ShowString();

b->ShowString();

cout<<"-----객체 소멸 직전----"<<endl;cout<<str1<< ;

}

};

class BBB : public AAA

{

delete a; // AAA 소멸자만 호출

delete b; // BBB,AAA 소멸자 호출

return 0;

}{

char* str2;

public:

BBB(char* _str1, char* _str2) : AAA(_str1){

str2= new char[strlen( str2)+1];

Good eveningGood morning-----객체 소멸 직전----~AAA() call!str2 new char[strlen(_str2)+1];

strcpy(str2, _str2);

}

~AAA() call!~BBB() call!~AAA() call!

32C++ Programming

Page 33: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

Virtual 소멸자의 필요성

상속하고 있는 클래스 객체 소멸 문제점

C++ Programming33

Page 34: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

virtual 소멸자 예BBB(){#include <iostream>

using std::endl;

using std::cout;

class AAA

{

~BBB(){

cout<<"~BBB() call!"<<endl;

delete []str2;

}

i t l id Sh St i (){{

char* str1;

public:

AAA(char* _str1){

t 1 h [ t l ( t 1) 1]

virtual void ShowString(){

AAA::ShowString();

cout<<str2<<endl;

}

};str1= new char[strlen(_str1)+1];

strcpy(str1, _str1);

}

virtual ~AAA(){

cout<<" AAA() call!"<<endl;

};

int main()

{

AAA * a=new BBB("Good", "evening");

BBB * b=new BBB("Good" "morning");cout<< ~AAA() call! <<endl;

delete []str1;

}

virtual void ShowString(){

cout<<str1<<' ';

BBB * b=new BBB( Good , morning );

a->ShowString();

b->ShowString();

cout<<"-----객체 소멸 직전----"<<endl;

delete a; // BBB AAA 소멸자만 호출cout<<str1<< ;

}

};

class BBB : public AAA

{

delete a; // BBB, AAA 소멸자만 호출

delete b; // BBB,AAA 소멸자 호출

return 0;

} Good eveningG d i{

char* str2;

public:

BBB(char* _str1, char* _str2) : AAA(_str1){

str2= new char[strlen( str2)+1];

Good morning-----객체 소멸 직전----~BBB() call!~AAA() call!BBB() ll!str2 new char[strlen(_str2)+1];

strcpy(str2, _str2);

}

~BBB() call!~AAA() call!

34C++ Programming

Page 35: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

Virtual 소멸자의 필요성

virtual 소멸자

virtual ~AAA(){cout<<"~AAA() call!"<<endl;delete []str1;}}

C++ Programming35

Page 36: additional08.ppt [호환 모드]parkjonghyuk.net/.../LNIP2/additional/additional08.pdf · 2010-11-18 · 상속의조건 public 상속은is-a관계가성립되도록하자. 일반화일반화

Jong Hyuk Park