SlideShare uma empresa Scribd logo
1 de 17
Baixar para ler offline
11. 상속
차례
클래스 상속
생성자와 소멸자

2/17
클래스 상속 -1
클래스 상속
– 이미 정의된 클래스의 멤버를 새롭게 정의할 클
래스의 멤버로 참조케 함

상속의 관계
– 기반 클래스와 파생 클래스 또는
– 부모 클래스와 자식 클래스

3/17
클래스 상속 -2
클래스 상속 형식
class 파생클래스 : 접근지정자 기반클래스
{
멤버함수와 멤버변수 선언;
};

파생클래스의 객체는 기반 클래스의 멤버를
새롭게 정의하지 않아도 멤버 참조(protected
public : ○, private : Ⅹ)가 가능함

4/17
클래스 상속 -3
class PFigure //기반 클래스
{
public :
PFigure();
void SetColor(const string color);
string GetColor();
private :
string color;
};

class Circle : public PFigure //파생클래스
{
public :
Circle();
void SetR(const double r);
double GetArea();
private :
double r, area;
};

Circle 클래스의 객체가 참조할 수 있는 멤버 목록
- Circle(), SetR(), GetArea(), area
- PFigure(), SetColor(), GetColor(), color;

소스 11-2~11-3 (circle.h,circle.cpp, ch11_01.cpp)
5/17
소스 11-4~11-6 (ch11_str.h, ch11_str.cpp, ch11_02.cpp)
//ch11_str.h
#ifndef _STR_H_
#define _STR_H_
#define MAX 50
#include <iostream>
#include <string>
using namespace std;
class StringCharArray : public string
{
public :
void toCharArray(char *str);
};

//ch11_str.cpp
#include "ch11_str.h"
void StringCharArray::toCharArray(char
*str)
{
int i, len=this->length();
for (i=0; i<len; i++)
*(str+i)=this->at(i);

}

*(str+i)='0';

#else
#endif
6/17
클래스 상속에서의 접근 지정자
기반 클래스와 파생 클래스 관계에서 접근 지
정자에 따른 멤버 참조 여부
접근 지정자

자기자신
(기반 클래스)에서

파생 클래스에서

외부에서

public

참조 가능

참조 가능

참조 가능

protected

참조 가능

참조 가능

참조 불가능

private

참조 가능

참조 불가능

참조 불가능

7/17
소스 11-7~11-9 (ch11_a.h, ch11_a.cpp,
ch11_03.cpp)
//ch11_a.h
#ifndef _CH11_A_H_
#define _CH11_A_H_
#include <iostream>
using namespace std;
class A
{
public :
void SetVar(const int proVar_A, const int priVar_A);
void ShowVar();
protected :
int proVar_A;
private :
int priVar_A;
};

class B : public A
{
public :
void Show();
int b;
};
#else
#endif

8/17
소스 11_10, 11-11, 11-12 (ch11_geo.h, ch11_geo.cpp, ch11_04.cpp)
클래스 GeometricFigure 정의하기
- 멤버변수 color : 도형의 색을 저장, protected 접근속성으로 설정하기
- 생성자 : 도형의 기본 색을 “white”으로 할당
- SetColor() : 도형의 색을 매개변수로 받아서 멤버변수에 할당하기
- IsPaint() : 도형에 색이 칠해졌는가를 확인하기
- GetColor() : 도형의 색을 외부에 전달하기
//ch11_geo.h
#ifndef _GEO_H_
#define _GEO_H_
#include <iostream>
#include <string>
using namespace std;

class GeometricFigure
{
public :
GeometricFigure();
void SetColor(const string color);
bool IsPaint();
string GetColor();
protected :
string color;
};
#else
#endif
9/17
소스 11_13, 11-14, 11-15 (ch11_rec.h, ch11_rec.cpp, ch11_05.cpp)
클래스 Rectangle 정의하기
- GeometricFigure 클래스를 상속하는 파생 클래스
- 멤버변수 : 가로 길이, 세로 길이, 면적, 직사각형 색
- 가로 면 길이 설정, 세로 면 길이 설정
- 직사각형 색 설정
- 직사각형 면적 계산
- 가로 면 길이 출력, 세로 면 길이 출력
- 직사각형 색 출력
- 직사각형 면적 출력
멤버 변수 :
직사각형 색은 기반 클래스의 멤버에 이미 정의되어 있어 상속받아 사용하면 됨
멤버 함수 :
직사각형 색 설정과 출력은 기반 클래스의 멤버에 이미 정의되어 있어 상속받아 사용하
면됨

10/17
//ch11_rect.h
#ifndef _REC_H_
#define _REC_H_
#include "ch11_geo.h"
class Rectangle : public GeometricFigure
{
public:
Rectangle();
void SetWidth(const double width);
void SetHeight(const double height);
void CalArea();
double GetWidth();
double GetHeight();
double GetArea();
private :
double width;
double height;
double area;
};
#else
#endif

프로젝트에 포함되어야
할 파일은
- ch11_geo.h
- ch11_geo.cpp
- ch11_rect.h
- ch11_rect.cpp
- ch11_05.cpp

11/17
클래스 상속 관계에서의 생성자와 소멸자-기본
1
소스 11-19, 소스 1-20, 소스 1-21에서 생성자 실행 순서 확인하기

//ConTest.h
#ifndef _CONTEST_H_
#define _CONTEST_H_
#include <iostream>
using namespace std;
class CON1
{
public :
CON1();
~CON1();
};
class CON2 : public CON1
{
public :
CON2();
~CON2();
};

#else
#endif

//ConTest.cpp
#include "ConTest.h"

//ch11_07.cpp
#include "ConTest.h"

CON1::CON1()
{
cout << "*** CON1의 생성자***" << endl;
}

int main()
{
CON2 *p_TEST = new CON2;

CON1::~CON1()
{
cout << "*** CON1의 소멸자***" << endl;
}
CON2::CON2()
{
cout << "*** CON2의 생성자***" << endl;
}
CON2::~CON2()
{
cout << "*** CON2의 소멸자***" << endl;
}

delete p_TEST;
}

return 0;

실행 결과 :
*** CON1의
*** CON2의
*** CON2의
*** CON1의

생성자
생성자
소멸자
소멸자

***
***
***
***

12/17
클래스 상속 관계에서의 생성자와 소멸자-기본
2
파생 클래스의 객체 생성시 생성자 호출 순서
– 소스 11-19, 소스 1-20, 소스 1-21을 실행해서 생
성자 실행 순서를 확인하면
생성자 : 기반 클래스 생성자  파생 클래스 생성자
소멸자 : 파생 클래스 소멸자  기반 클래스 소멸자

 위의 생성자들은 매개변수 없는 생성자들로 객
체 생성시 자동 호출된 예

13/17
클래스 상속 관계에서의 매개변수 있는 생성자
ConTest.h와 ConTest.cpp에서 생성자를 다음과 같이 수정하기
//ConTest.h 수정내용
class CON1
{
public :
CON1(const int c);
~CON1();
protected:
int c; //멤버 변수 추가
};
//ConTest.cpp 수정 내용
CON1::CON1(const int c)
{
this->c=c;
cout << "*** CON1의생성자***" << endl;
cout << "c=" << c << endl;
}

//ch11_07.cpp
#include "ConTest.h"
int main()
{
CON2 *p_TEST = new CON2;
delete p_TEST;
}

return 0;

'CON1' : 사용할 수
있는 적절한 기본 생
성자가 없습니다. 
에러남!!
14/17
생성자 머리와 몸통
생성자는 생성자 선언과 생성자 초기화 목록
을 포함하는 생성자 머리부분과 실제 실행 내
용이 담겨진 머리 부분으로 구분됨
– 생성자 초기화 목록에서 기반 클래스의 생성자를
직접 호출할 수 있음!!!

15/17
파생 클래스 생성자에서 기반 클래스 생성자 임의 호
출

기반 클래스 생성자는 파생 클래스에서 자동
으로 호출됨!!!  매개변수가 있을 경우 반드
시 명시해야함!!!
//ConTest.cpp에서 CON2() 수정
CON2::CON2()
: CON1(300)
{
cout << "*** CON2의생성자***" << endl;
cout << "c=" << c << endl;
}

에러없이 실행됨!!!
클래스 상속에서 생성자 실행
순서 “파생클래스 생성자 머리
부분  기반 클래스 생성자
 파생 클래스 생성자 몸통부
분

16/17
기반 클래스의 생성자 오버로딩
기반 클래스 생성자가 오버로딩된 경우 파생
클래스에서 원하는 생성자 호출 가능  생성
자 초기화 목록에서~
소스 11-22, 11-23, 11-24 (ch11_person.h,
ch11_person.cpp, ch11_08.cpp)

17/17

Mais conteúdo relacionado

Destaque

12장 상속 (고급)
12장 상속 (고급)12장 상속 (고급)
12장 상속 (고급)유석 남
 
이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디quxn6
 
12 2. dynamic allocation
12 2. dynamic allocation12 2. dynamic allocation
12 2. dynamic allocation웅식 전
 
이펙티브 C++ 공부
이펙티브 C++ 공부이펙티브 C++ 공부
이펙티브 C++ 공부quxn6
 
15 3. modulization
15 3. modulization15 3. modulization
15 3. modulization웅식 전
 
상속 관련 이것저것
상속 관련 이것저것상속 관련 이것저것
상속 관련 이것저것EG Lim
 
Responding to change
Responding to changeResponding to change
Responding to change기룡 남
 

Destaque (8)

12장 상속 (고급)
12장 상속 (고급)12장 상속 (고급)
12장 상속 (고급)
 
이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디
 
12 2. dynamic allocation
12 2. dynamic allocation12 2. dynamic allocation
12 2. dynamic allocation
 
이펙티브 C++ 공부
이펙티브 C++ 공부이펙티브 C++ 공부
이펙티브 C++ 공부
 
15 3. modulization
15 3. modulization15 3. modulization
15 3. modulization
 
13. structure
13. structure13. structure
13. structure
 
상속 관련 이것저것
상속 관련 이것저것상속 관련 이것저것
상속 관련 이것저것
 
Responding to change
Responding to changeResponding to change
Responding to change
 

Semelhante a Week12 chapter11

09장 객체와 클래스 (고급)
09장 객체와 클래스 (고급)09장 객체와 클래스 (고급)
09장 객체와 클래스 (고급)유석 남
 
Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Realm은 어떻게 효율적인 데이터베이스를 만들었나?Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Realm은 어떻게 효율적인 데이터베이스를 만들었나?Leonardo YongUk Kim
 
변수 이름의 효과
변수 이름의 효과변수 이름의 효과
변수 이름의 효과민욱 이
 
파이썬 함수 이해하기
파이썬 함수 이해하기 파이썬 함수 이해하기
파이썬 함수 이해하기 Yong Joon Moon
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++KWANGIL KIM
 
Perl Script Document
Perl Script DocumentPerl Script Document
Perl Script Document오석 한
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)Sang Don Kim
 
[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
 
파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229Yong Joon Moon
 
파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304Yong Joon Moon
 
프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js functionYoung-Beom Rhee
 

Semelhante a Week12 chapter11 (16)

09장 객체와 클래스 (고급)
09장 객체와 클래스 (고급)09장 객체와 클래스 (고급)
09장 객체와 클래스 (고급)
 
Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Realm은 어떻게 효율적인 데이터베이스를 만들었나?Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Realm은 어떻게 효율적인 데이터베이스를 만들었나?
 
변수 이름의 효과
변수 이름의 효과변수 이름의 효과
변수 이름의 효과
 
10th
10th10th
10th
 
6 function
6 function6 function
6 function
 
파이썬 함수 이해하기
파이썬 함수 이해하기 파이썬 함수 이해하기
파이썬 함수 이해하기
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++
 
Perl Script Document
Perl Script DocumentPerl Script Document
Perl Script Document
 
06장 함수
06장 함수06장 함수
06장 함수
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
 
[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
 
파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229
 
파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304
 
강의자료3
강의자료3강의자료3
강의자료3
 
프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function
 

Mais de 웅식 전

15 2. arguement passing to main
15 2. arguement passing to main15 2. arguement passing to main
15 2. arguement passing to main웅식 전
 
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웅식 전
 
Goorm ide 교육용버전 for skku(학생)
Goorm ide 교육용버전 for skku(학생)Goorm ide 교육용버전 for skku(학생)
Goorm ide 교육용버전 for skku(학생)웅식 전
 
구름 기본 소개자료
구름 기본 소개자료구름 기본 소개자료
구름 기본 소개자료웅식 전
 
Goorm ide 소개 슬라이드(교육용 버전)
Goorm ide 소개 슬라이드(교육용 버전)Goorm ide 소개 슬라이드(교육용 버전)
Goorm ide 소개 슬라이드(교육용 버전)웅식 전
 

Mais de 웅식 전 (20)

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
 
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
 
Goorm ide 교육용버전 for skku(학생)
Goorm ide 교육용버전 for skku(학생)Goorm ide 교육용버전 for skku(학생)
Goorm ide 교육용버전 for skku(학생)
 
구름 기본 소개자료
구름 기본 소개자료구름 기본 소개자료
구름 기본 소개자료
 
Goorm ide 소개 슬라이드(교육용 버전)
Goorm ide 소개 슬라이드(교육용 버전)Goorm ide 소개 슬라이드(교육용 버전)
Goorm ide 소개 슬라이드(교육용 버전)
 

Week12 chapter11

  • 3. 클래스 상속 -1 클래스 상속 – 이미 정의된 클래스의 멤버를 새롭게 정의할 클 래스의 멤버로 참조케 함 상속의 관계 – 기반 클래스와 파생 클래스 또는 – 부모 클래스와 자식 클래스 3/17
  • 4. 클래스 상속 -2 클래스 상속 형식 class 파생클래스 : 접근지정자 기반클래스 { 멤버함수와 멤버변수 선언; }; 파생클래스의 객체는 기반 클래스의 멤버를 새롭게 정의하지 않아도 멤버 참조(protected public : ○, private : Ⅹ)가 가능함 4/17
  • 5. 클래스 상속 -3 class PFigure //기반 클래스 { public : PFigure(); void SetColor(const string color); string GetColor(); private : string color; }; class Circle : public PFigure //파생클래스 { public : Circle(); void SetR(const double r); double GetArea(); private : double r, area; }; Circle 클래스의 객체가 참조할 수 있는 멤버 목록 - Circle(), SetR(), GetArea(), area - PFigure(), SetColor(), GetColor(), color; 소스 11-2~11-3 (circle.h,circle.cpp, ch11_01.cpp) 5/17
  • 6. 소스 11-4~11-6 (ch11_str.h, ch11_str.cpp, ch11_02.cpp) //ch11_str.h #ifndef _STR_H_ #define _STR_H_ #define MAX 50 #include <iostream> #include <string> using namespace std; class StringCharArray : public string { public : void toCharArray(char *str); }; //ch11_str.cpp #include "ch11_str.h" void StringCharArray::toCharArray(char *str) { int i, len=this->length(); for (i=0; i<len; i++) *(str+i)=this->at(i); } *(str+i)='0'; #else #endif 6/17
  • 7. 클래스 상속에서의 접근 지정자 기반 클래스와 파생 클래스 관계에서 접근 지 정자에 따른 멤버 참조 여부 접근 지정자 자기자신 (기반 클래스)에서 파생 클래스에서 외부에서 public 참조 가능 참조 가능 참조 가능 protected 참조 가능 참조 가능 참조 불가능 private 참조 가능 참조 불가능 참조 불가능 7/17
  • 8. 소스 11-7~11-9 (ch11_a.h, ch11_a.cpp, ch11_03.cpp) //ch11_a.h #ifndef _CH11_A_H_ #define _CH11_A_H_ #include <iostream> using namespace std; class A { public : void SetVar(const int proVar_A, const int priVar_A); void ShowVar(); protected : int proVar_A; private : int priVar_A; }; class B : public A { public : void Show(); int b; }; #else #endif 8/17
  • 9. 소스 11_10, 11-11, 11-12 (ch11_geo.h, ch11_geo.cpp, ch11_04.cpp) 클래스 GeometricFigure 정의하기 - 멤버변수 color : 도형의 색을 저장, protected 접근속성으로 설정하기 - 생성자 : 도형의 기본 색을 “white”으로 할당 - SetColor() : 도형의 색을 매개변수로 받아서 멤버변수에 할당하기 - IsPaint() : 도형에 색이 칠해졌는가를 확인하기 - GetColor() : 도형의 색을 외부에 전달하기 //ch11_geo.h #ifndef _GEO_H_ #define _GEO_H_ #include <iostream> #include <string> using namespace std; class GeometricFigure { public : GeometricFigure(); void SetColor(const string color); bool IsPaint(); string GetColor(); protected : string color; }; #else #endif 9/17
  • 10. 소스 11_13, 11-14, 11-15 (ch11_rec.h, ch11_rec.cpp, ch11_05.cpp) 클래스 Rectangle 정의하기 - GeometricFigure 클래스를 상속하는 파생 클래스 - 멤버변수 : 가로 길이, 세로 길이, 면적, 직사각형 색 - 가로 면 길이 설정, 세로 면 길이 설정 - 직사각형 색 설정 - 직사각형 면적 계산 - 가로 면 길이 출력, 세로 면 길이 출력 - 직사각형 색 출력 - 직사각형 면적 출력 멤버 변수 : 직사각형 색은 기반 클래스의 멤버에 이미 정의되어 있어 상속받아 사용하면 됨 멤버 함수 : 직사각형 색 설정과 출력은 기반 클래스의 멤버에 이미 정의되어 있어 상속받아 사용하 면됨 10/17
  • 11. //ch11_rect.h #ifndef _REC_H_ #define _REC_H_ #include "ch11_geo.h" class Rectangle : public GeometricFigure { public: Rectangle(); void SetWidth(const double width); void SetHeight(const double height); void CalArea(); double GetWidth(); double GetHeight(); double GetArea(); private : double width; double height; double area; }; #else #endif 프로젝트에 포함되어야 할 파일은 - ch11_geo.h - ch11_geo.cpp - ch11_rect.h - ch11_rect.cpp - ch11_05.cpp 11/17
  • 12. 클래스 상속 관계에서의 생성자와 소멸자-기본 1 소스 11-19, 소스 1-20, 소스 1-21에서 생성자 실행 순서 확인하기 //ConTest.h #ifndef _CONTEST_H_ #define _CONTEST_H_ #include <iostream> using namespace std; class CON1 { public : CON1(); ~CON1(); }; class CON2 : public CON1 { public : CON2(); ~CON2(); }; #else #endif //ConTest.cpp #include "ConTest.h" //ch11_07.cpp #include "ConTest.h" CON1::CON1() { cout << "*** CON1의 생성자***" << endl; } int main() { CON2 *p_TEST = new CON2; CON1::~CON1() { cout << "*** CON1의 소멸자***" << endl; } CON2::CON2() { cout << "*** CON2의 생성자***" << endl; } CON2::~CON2() { cout << "*** CON2의 소멸자***" << endl; } delete p_TEST; } return 0; 실행 결과 : *** CON1의 *** CON2의 *** CON2의 *** CON1의 생성자 생성자 소멸자 소멸자 *** *** *** *** 12/17
  • 13. 클래스 상속 관계에서의 생성자와 소멸자-기본 2 파생 클래스의 객체 생성시 생성자 호출 순서 – 소스 11-19, 소스 1-20, 소스 1-21을 실행해서 생 성자 실행 순서를 확인하면 생성자 : 기반 클래스 생성자  파생 클래스 생성자 소멸자 : 파생 클래스 소멸자  기반 클래스 소멸자  위의 생성자들은 매개변수 없는 생성자들로 객 체 생성시 자동 호출된 예 13/17
  • 14. 클래스 상속 관계에서의 매개변수 있는 생성자 ConTest.h와 ConTest.cpp에서 생성자를 다음과 같이 수정하기 //ConTest.h 수정내용 class CON1 { public : CON1(const int c); ~CON1(); protected: int c; //멤버 변수 추가 }; //ConTest.cpp 수정 내용 CON1::CON1(const int c) { this->c=c; cout << "*** CON1의생성자***" << endl; cout << "c=" << c << endl; } //ch11_07.cpp #include "ConTest.h" int main() { CON2 *p_TEST = new CON2; delete p_TEST; } return 0; 'CON1' : 사용할 수 있는 적절한 기본 생 성자가 없습니다.  에러남!! 14/17
  • 15. 생성자 머리와 몸통 생성자는 생성자 선언과 생성자 초기화 목록 을 포함하는 생성자 머리부분과 실제 실행 내 용이 담겨진 머리 부분으로 구분됨 – 생성자 초기화 목록에서 기반 클래스의 생성자를 직접 호출할 수 있음!!! 15/17
  • 16. 파생 클래스 생성자에서 기반 클래스 생성자 임의 호 출 기반 클래스 생성자는 파생 클래스에서 자동 으로 호출됨!!!  매개변수가 있을 경우 반드 시 명시해야함!!! //ConTest.cpp에서 CON2() 수정 CON2::CON2() : CON1(300) { cout << "*** CON2의생성자***" << endl; cout << "c=" << c << endl; } 에러없이 실행됨!!! 클래스 상속에서 생성자 실행 순서 “파생클래스 생성자 머리 부분  기반 클래스 생성자  파생 클래스 생성자 몸통부 분 16/17
  • 17. 기반 클래스의 생성자 오버로딩 기반 클래스 생성자가 오버로딩된 경우 파생 클래스에서 원하는 생성자 호출 가능  생성 자 초기화 목록에서~ 소스 11-22, 11-23, 11-24 (ch11_person.h, ch11_person.cpp, ch11_08.cpp) 17/17