Software Development/C, C++

[C++] 상속(Inheritance)

huiyu 2018. 12. 31. 07:18

상속(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)의 이해

728x90