보충자료 7. 상속 (inheritance) 의이해 상속의기본개념 상속의생성자, 소멸자 protected 멤버 Jong Hyuk Park
상속의기본개념 Jong Hyuk Park
상속의기본개념 상속의예 1 " 철수는아버지로부터좋은목소리와큰키를물려 받았다." 상속의예 2 "Student 클래스가 Person 클래스를상속한다." 아버지 Person 철수 Stduent 3
파생클래스 (derived class) 상속 (inheritance) 한클래스가다른클래스에서정의된속성 ( 자료, 함수 ) 를이어받아그대로사용 이미정의된클래스를바탕으로필요한기능을추가하여정의 소프트웨어재사용지원 파생클래스는 C++ 에서각클래스의속성을공유하고물려받는객체지향프로그래밍의상속 (inheritance) 을구현한것 이미만들어진기존의클래스를베이스클래스 (base class) 또는부모클래스 (parent class) or 슈퍼클래스 이를상속받아새로만들어지는클래스를파생클래스 (derived class) or 하위클래스라고도함. 4
공용부분상속 class 파생클래스명 : public[private] 베이스클래스명 ; public 베이스클래스 파생클래스 전용부분 전용부분 공용부분 상속 공용부분 private 베이스클래스 파생클래스 전용부분 상속 전용부분 공용부분 공용부분 객체생성순서 ---------------- 1. 메모리할당 2. 베이스클래스생성자실행 3.Derived 클래스생성자실행 5
베이스클래스와파생클래스예 class Person int age; char name[20]; int GetAge() const const char* GetName() const Person(int _age=1, char* _name= name="noname") noname ; Base class Derived class class Student: public Person char major[20]; // 전공 Student(char* _major) const char* GetMajor() const void ShowData() const ; 6
생성자, 소멸자 베이스클래스, 파생클래스가생성자, 소멸자를갖는경우에생성자는파생되는순서에따라호출되고소멸자는파생된순서의반대로호출 파생클래스의객체가생성될때먼저베이스클래스의생성자가호출되어실행된후파생클래스의생성자가호출되어실행 소멸자인경우에는실행순서가생성자와는반대로파생클래스의소멸자가실행된후베이스클래스의소멸자가실행 베이스클래스의생성자에인수를전달하고자하는경우파생클래스의생성자를정의할때베이스클래스에전달될인수를다음과같이기술 파생클래스 _ 생성자명 ( 인수리스트 ) : 베이스클래스 _ 생성자명 ( 인수리스트 ) ; 7
상속의생성자예 1 8 #include <iostream> using std::endl; using std::cout; class AAA //Base 클래스 AAA() cout<<"aaa() call!"<<endl; AAA(int i) cout<<"aaa(int i) call!"<<endl; ; class BBB : public AAA //Derived 클래스 BBB() cout<<"bbb() call!"<<endl; BBB(int j): AAA( j) cout<<"bbb(int j) call!"<<endl; ; int main(void) cout << " 객체 1 생성 "<<endl; BBB bbb1; cout << " 객체 2 생성 " << endl; BBB bbb2(10); return 0; 객체 1 생성 AAA() call! BBB() call! 객체 2 생성 AAA(int i) call! BBB(int j) call!
#include <iostream> using std::endl; using std::cout; class Person int age; char name[20]; ; public 상속예 1 int GetAge() const return age; const char* GetName() const return name; Person(int _age=1, char* _name="noname") age=_age; strcpy(name, _name); 문제점?? 9 실행후출력값확인 원하는형태로초기화안됨. class Student: public Person char major[20]; // 전공 Student(char* _major) strcpy(major, _major); const char* GetMajor() const return major; void ShowData() const cout<<" 이름 : "<<GetName()<<endl; cout<<" 나이 : "<<GetAge()<<endl; cout<<" 전공 : "<<GetMajor()<<endl; ; int main(void) Student Kim("computer"); Kim.ShowData(); ; return 0;
public 상속예 2 BasicInheri2.cpp student 생성자변경 Student 클래스의멤버age, name이 private이아닌경우가능 정보은닉에위배 10
BasicInheri2.cpp #include <iostream> using std::endl; using std::cout; class Person int age; char name[20]; ; int GetAge() const return age; const char* GetName() const return name; Person(int _age=1, char* _name="noname") age=_age; strcpy(name, _name); class Student: public Person char major[20]; // 전공 Student(int _age, char* _name, char* _major) age=_age; g // 컴파일에러 strcpy(name, _name); // 컴파일에러 strcpy(major, _major); const char* GetMajor() const return major; void ShowData() const cout<<" 이름 : "<<GetName()<<endl; cout<<" 나이 : "<<GetAge()<<endl; cout<<" 전공 : "<<GetMajor()<<endl; ; int main(void) Student Kim(20, "Hong Gil Dong", "computer"); Kim.ShowData(); ; return 0; 11
public 상속예 3 BasicInheri3.cpp 멤버이니셜라이저활용 Base 클래스의생성자명시적호출 12
BasicInheri3.cpp #include <iostream> using std::endl; using std::cout; class Person int age; char name[20]; 13 class Student: public Person char major[20]; // 전공 Student(int _age, char* _name, char* _major) : Person(_age, _name) strcpy(major, _major); const char* GetMajor() const return major; int GetAge() const return age; void ShowData() const cout<<" 이름 : "<<GetName()<<endl; const char* GetName() const cout<<" 나이 : "<<GetAge()<<endl; return name; cout<<" 전공 : "<<GetMajor()<<endl; ; Person(int _age=1, char* int main(void) _name= name="noname") noname age=_age; Student Kim(20, "Hong Gil Dong", strcpy(name, _name); "computer"); Kim.ShowData(); ; return 0; ;
상속의소멸자예 14 #include <iostream> using std::endl; using std::cout; class AAA //Base 클래스 AAA() cout<<"aaa() call!"<<endl; ~AAA() cout<< ~AAA(int i) call!"<<endl; ; class BBB : public AAA //Derived 클래스 BBB() cout<<"bbb() call!"<<endl; ~BBB() cout<<"~bbb() call!"<<endl; ; 객체소멸순서 1. Derived 클래스소멸자실행 2.base 클래스소멸자실행 3. 메모리반환 ( 해제 ) int main(void) BBB bbb; return 0; AAA() call! BBB() call! ~BBB() call! ~AAA() call!
protected 멤버 Jong Hyuk Park
protected 멤버상속 (1) 파생클래스의멤버함수는베이스클래스의공용멤버에직접접근이가능하지만베이스클래스의전용멤버에대해서는접근할수없음 파생클래스의멤버함수가베이스클래스의전용멤버를상속받아자유로이사용을위해서는다음두가지방식사용 프렌드함수를사용 베이스클래스정의시 protected 키워드를사용한보호부분을정의 보호부분에있는멤버는전용멤버와같이외부에서는직접접근할수없지만파생클래스의멤버함수에서는직접접근이가능 보호부분멤버가파생클래스에서 public 으로상속받으면파생클래스의 protected 멤버가됨 private으로상속받으면파생클래스에서전용부분멤버가됨 16
protected 멤버상속예 1 상속관계에놓여있는경우접근허용 그이외는 private 멤버와동일 class AAA private: int a; protected: int b; ; int main(void) AAA aaa; aaa.a=10; // private 멤버, 따라서에러!! aaa.b=20; // protected 멤버, 따라서에러!! BBB bbb; bbb.setdata(); 17 class BBB: public AAA void SetData() a=10; // private 멤버, 따라서에러 b=10; // protected 멤버, OK! ; return 0;
18 protected 멤버상속예 2 BasicInheri4.cpp #include <iostream> using std::endl; using std::cout; class Person protected: int age; char name[20]; ; int GetAge() const return age; const char* GetName() const return name; Person(int _age=1, char* _name="noname") age=_age; strcpy(name, _name); class Student: public Person char major[20]; // 전공 Student(int _age, char* _name, char* _major) age=_age; strcpy(name, _name); strcpy(major, _major); const char* GetMajor() const return major; void ShowData() const cout<<" 이름 : "<<GetName()<<endl; cout<<" 나이 : "<<GetAge()<<endl; cout<<" 전공 : "<<GetMajor()<<endl; ; int main(void) Student Kim(20, "Hong Gil Dong", "computer"); Kim.ShowData(); return 0; ;
세가지형태의상속 접근권한변경 - Base 클래스의멤버는상속되는과정에서접근권한변경 Base 클래스 상속형태 public 상속 protected 상속 private 상속 public 멤버 public protected private Protected 멤머 protected protected private Private 멤버접근불가접근불가접근불가 class 클래스명 [private:] protected: ; 19 // 전용부분멤버정의 // 클래스외부접근및상속안됨 // 보호부분멤버정의 // 클래스외부접근안됨, 상속됨 // 공용부분멤버정의 // 클래스외부접근및상속됨
세가지형태의상속 class Base private: int a; protected: int b; int c; ; int main(void) Derived object; return 0; ; 20 class Derived : public Base // public 상속 ; // EMPTY protected? private? ** 사용된상속보다넓은범위는그범위로맞춤.
상속을하는이유 문제의도입 운송수단에관련된클래스정의 자동차 (car), 열차 (train), 선박 (ship), 비행기 (Airplane) 등등 class Airpalne int passenger; // 탑승인원 int baggage; // 수하물의무게 int crew_man; // 승무원인원 Airpalne(int p=0, int w=0, int c=0); void Ride(int person); // 탑승하다. void Load(int weight) // 짐을싣다. void TakeCrew(int crew) // 승무원탑승 class Train int passenger; // 탑승인원 int baggage; // 수하물의무게 int length; // 열차의칸수 Train(int p=0, int w=0, int l=0); void Ride(int person); // 탑승하다. void Load(int weight); // 짐을싣다. void SetLength(int len); // 열차의칸수설정 ; 21
상속을하는이유 문제의해결 class Vehicle int passenger; int baggage; Vehicle(int person=0, int weight=0); void Ride(int person); // 탑승하다. void Load(int weight); // 짐을싣다. ; Airplane Train 22
Jong Hyuk Park