반응형

 

상속(Inheritance)

- 다른 클래스의 멤버 변수, 멤버 함수를 자신의 멤버인 것처럼 사용이 가능.

- B라는 클래스가 A 클래스를 상속하게 되면, B 클래스는 A 클래스가 지니고 있는 모든 멤버를 물려받는다.

- 클래스의 재사용과 관련이 있다.

 

상속 예제 코드

#include <iostream>
#include <string>
using namespace std;

class Person
{
private:
    int age;
    int height;
public:
    Person(int _age, int _height) : age(_age), height(_height) { }
};

class Employee : public Person
{
private:
    string department;
    string position;
public:
    Employee(string _department, string _position, int _age, int _height) : Person(_age, _height)
    {
        department = _department;
        position = _position;
    }
};

void main()
{
    Employee employee("R&D", "Staff", 20, 180);
}
  • Person 클래스를 상속한 Employee 클래스의 생성자는 부모 클래스인 Person 클래스의 멤버까지 초기화해야할 의무가 있다.
  • 자식 클래스의 생성자는 부모 클래스의 생성자를 호출해서 부모 클래스의 멤버를 초기화하는 것이 좋다.
  • (자식 클래스는 이니셜라이저(콜론 초기화)를 이용해서 상속 클래스의 생성자 호출을 명시할 수 있다.)

 

상속 용어 정리

Person Employee
상위 클래스 하위 클래스
기초(Base) 클래스 유도(Derived) 클래스
슈퍼(Super) 클래스 서브(Sub) 클래스
부모 클래스 자식 클래스
  • 일반적으로 기초 클래스와 유도 클래스라는 표현을 사용한다.

 

 

 

상속 생성자 호출 순서 예제 코드

#include <iostream>
using namespace std;

class Base
{
private:
    int baseNum;
public:
    Base(int n) : baseNum(n)
    {
        cout << "Base(int n)" << endl;
    }
    ~Base()
    {
        cout << "~Base()" << endl;
    }
};

class Derived : public Base
{
private:
    int derivNum;
public:
    Derived(int n1, int n2) : Base(n1), derivNum(n2)
    {
        cout << "Derived(int n1, int n2)" << endl;
    }
    ~Derived()
    {
        cout << "~Derived()" << endl;
    }
};

void main()
{
    Derived derived(10, 20);
    
    //결과
    //Base(int n)
    //Derived(int n1, int n2)
    //~Derived()
    //~Base()
}
  • 자식 클래스에서 생성자가 호출될 때, 이니셜라이저에 부모 클래스의 생성자가 호출이 되는지 확인한 후, 이니셜라이저에 있는 생성자가 호출될지 void형 생성자가 호출될지 정해진다.
  • 자식 클래스를 만든다고 해서 자식 클래스의 생성자가 먼저 호출되지 않고, 부모 클래스의 생성자가 먼저 호출 되는것을 확인할 수 있다.
  • 소멸자는 생성자와 반대로 자식 클래스, 부모 클래스 순으로 호출된다.

 

 

 

상속과 접근지시자

- public > protected > private

- 상속 관계에서는 public과 protected가 차이를 보이지 않는다.

- protected에 선언된 멤버는 자식 클래스에서도 자유롭게 사용할 수 있지만, 부모 클래스와 자식 클래스 사이에서도 '정보은닉'은 지켜지는게 좋다.

- 상속을 명시할 때 사용하는 접근지시자는 다음과 같은 특성을 가지고 있다.

  • public : public 범위의 멤버를 public으로 변경시켜서 상속.
  • protected : protected 보다 넓은(public) 접근 범위의 멤버를 protected로 변경시켜서 상속
  • private : private 보다 넓은(public, protected) 접근 범위의 범버를 private로 변경시켜서 상속

- public 이외의 상속은 다중상속과 같이 특별한 경우가 아니라면 잘 사용하지 않는다.

 

 

 

 

상속의 조건

- 상속은 다음과 같은 조건에서 사용한다.

  • IS-A((자식)은 (부모)이다) : Employee(자식 클래스)는 Person(부모 클래스)이다. 
  • HAS-A((자식)은 (부모)를 갖고있다) : Police(자식 클래스)는 Gun(부모 클래스)를 갖고있다.

- HAS-A의 관계는 다음과 같은 이유로 상속보다는 멤버로 갖고있는것이 더 좋은 모델이 될 수 있다.

  • 총을 소유하지 않은 경찰을 표현해야 할 수도 있다.
  • 경찰이 총이 아니라, 3단봉을 소유할 수도 있다.

- 결론 : 상속은 IS-A 관계의 표현에 적합. HAS-A 관계에서도 사용될 수 있으나, 프로그램 변경에 많은 제약을 가져다 줄 수 있다.

반응형

'Stack > C++' 카테고리의 다른 글

C++ 순수 가상함수, 추상 클래스  (0) 2021.11.11
C++ 업캐스팅, 오버라이딩, 가상함수  (0) 2021.11.08
C++ 함수 오버로딩, Deault 매개변수  (0) 2021.10.24
C++ this 포인터  (0) 2021.10.24
C++ 복사 생성자 심화  (0) 2021.10.17

+ Recent posts