상속(Inheritance)
- 이미 정의된 클래스로부터 특성을 물려받아 새로운 클래스를 클래스를 작성하는 기법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | class Person { private : int age; char name[50]; public: Person(int myage, char *myname) : age(myage) { strcpy(name, myname); } void WhatyourName() const { cout<<"My name is "<<name<<endl; } void HowOldAreYou() const { couot<<"I'm "<<age<<" years old"<<endl; } }; class UnivStudent : public Person { private: char major[50]; public: UnivStudent(char *myname, int myage, char *mymajor) : Person(myage, myname) { strcpy(major, mymajor); } void WhoAreYou() const { WhatYourName(); HowOldAreYou(); cout<<"My major is "<<major<<endl<<endl; } }; | cs |
->
class UnivStudent : public Person
{ ... }
위의 'UnivStudent' 클래스 정의가 의미하는 것은 'public 상속'이다.
UnivStudent의 WhoAreYou()함수에는 WhatYourName()함수와 HowOldAreYou()함수가 정의되어 있지 않음에도, 이 두함수를 호출하고 있다. 이게 가능한 이유는 UnivStudent클래스가 Person 클래스를 상속했기 때문이다. 즉, 이 두함수는 Person 클래스의 멤버함수이기 때문에 호출이 가능하다.
위 그림에서 보여주듯이 상속을 하게 되면, 상속의 대상이 되는 클래스의 멤버까지도 객체 내에 포함이 된다.
*상속에서는 상속을 해주는 부모 클래스(기초클래스, 슈퍼클래스, 상위클래스)와 상속을 받는 자식 클래스(유도 클래스, 서브 클래스, 하위클래스)가 있으며, 상속의 형식은 아래와 같다.
1 2 3 | class 자식클래스명 : 상속접근제어 부모클래스명 { } | cs |
상속받은 클래스의 생성자 정의
1 2 3 4 | UnivStudent(char *myname, int myage, char *mymajor) : Person(myage, myname) { strcpy(major, mymajor); } | cs |
-> UnivStudent 클래스의 생성자는 자신이 상속한 Person 클래스의 멤버를 초기화할 의무를 지닌다. 그래서 UnivStudent의 생성자는 Person의 생성자를 호출하는 형태로 Person 클래스의 멤버를 초기화하는 것이 좋다.
상속 클래스의 생성자와 소멸자
생성자
- 자식클래스의 객체 생성과정에서 부모 클래스의 생성자는 100%호출된다.
- 자식 클래스의 생성자에서 부모 클래스의 생성자 호출을 명시하지 않으면, 부모 클래스의 void 생성자가 호출된다.
- 호출순서는 부모클래스의 생성자->자식클래스의 생성자 순으로 호출된다.
소멸자
- 자식 클래스의 객체가 소멸될때에는, 자식 클래스의 소멸자가 실행되고 난 다음게 부모 클래스의 소멸자가 실행된다.
- 스택에 생성된 객체의 소멸순서는 생성순서와 반대이다.
상속접근 제어 속성
상속 접근 제어 속성 부모클래스의 멤버 속성 |
private |
protected |
public |
private |
접근불가 |
접근불가 |
접근불가 |
protected |
private |
protected |
protected |
public |
private |
protected |
public |
- protectd 상속 : protected보다 접근 범위가 넓은 멤버는 protected로 변경시켜 상속한다.
-> protected -> protected, public -> protected
- private 상속 : private보다 접근 범위가 넓은 멤버는 private으로 변경시켜 상속한다.
-> protected -> private, public->private
- public 상속 : public보다 접근 범위가 넓은 멤버는 public으로 변경시켜 상속한다.(private을 제외한 나머지는 그냥 그대로 상속한다.)
[참고자료]
윤성우의 열혈 C++ 프로그래밍 07 상속(Inheritance)의 이해
'Software Development > C, C++' 카테고리의 다른 글
[C++] 가상 상속 (Virtual Inheritance) (0) | 2019.01.02 |
---|---|
[C++] 오버라이딩과 가상함수 (0) | 2019.01.01 |
[C++] C++에서의 static (0) | 2018.12.30 |
[C++] const, friend 키워드 (0) | 2018.12.30 |
[C++] 복사 생성자의 호출시점 (1) | 2018.12.29 |