본문 바로가기

프로그래밍 언어/열혈 C++

07 상속의 이해 by 윤성우의 열혈 C++

상속

  • A 클래스가 B클래스를 상속하게 되면 A클래스는 B클래스의 모든 멤버(변수, 함수)를 상속받는다.
  • 이 때 A클래스를 유도 클래스, 자식 클래스 하위 클래스 등으로 부르고 B클래스를 기초 클래스, 부모 클래스, 상위 클래스등으로 부른다. (유도 클래스와 기초 클래스를 일반적으로 사용됨)
  • 유도 클래스는 기초 클래스의 모든 멤버변수를 가져오기때문에 유도 클래스 생성자를 호출할때 기초 클래스의 모든 변수를 초기화해야한다. (기초 클래스를 초기화할때 기초 클래스의 생성자로 초기화하자)
Student: public Person
{
private:
    int grade
}

Student(char *name, int age, int grade)
    :Person(name, age)	// 기초 클래스의 생성자로 초기화
{
    this->grade = grade;
}
  • 유도 클래스의 생성자에서 기초 클래스의 생성자를 호출하지 않으면 기초 클래스의 void 생성자가 호출된다.
  • 기초 클래스의 생성자 호출 -> 유도 클래스의 생성자 호출 -> 유도 클래스의 소멸자 호출 -> 기초 클래스의 소멸자 호출 (스택 구조)

 

protected

  • 외부에서 접근할 수 없고 클래스 내에서나 상속하는 유도 클래스에서 접근이 가능하다.

하지만 기초 클래스와 유도 클래스 사이에서도 정보 은닉은 유지되는게 좋다.

 

 

세가지 상속

  • private 상속

기초 클래스의 private는 접근불가

기초 클래스의 protected, public을 private로 상속받음

 

  • protected 상속

기초 클래스의 private는 접근불가

기초 클래스의 public은 protected로 상속받음

 

  • public 상속

기초 클래스의 private는 접근불가

나머지는 있는 그대로 상속받음

 

다중상속외에는 public 상속만 생각해도 문제없다.

 

 

상속을 위한 조건

 

  • IS-A

전화기 - 무선 전화기

컴퓨터 - 노트북 컴퓨터

 

무선 전화기 is a 전화기

노트북 컴퓨터 is a 컴퓨터

 

특성을 그대로 다 가져올 수 있는 집합내의 집합일 경우에 사용

 

  • HAS-A

총 - 경찰

분필 - 교사

 

경찰 has a 총

교사 has a 분필

 

하지만 HAS-A는 잘 쓰이지 않는다.

총을 든 경찰 분필을 든 교사만 표현할 수 있기때문에

총 객체를 private 멤버변수로 선언하는 편이다.

 

class AccountHandler
{
private:
    Account* accList[100]; // 계좌 관리자가 소유한 계좌
    int accNum;
public:
    AccountHandler();
    int ShowMenu() const;           // 메뉴출력
    void MakeAccount();             // 계좌계설
    void DepositMoney();            // 입    금
    void WithdrawMoney();           // 출    금
    void ShowAllAccInfo() const;    // 잔액조회
    int GetAccNum() const;
    ~AccountHandler();
};

- 4행에서 계좌리스트를 멤버로 선언했다.