상속(1)

은수·2022년 5월 30일

cpp study

목록 보기
6/21

상속(Inheritance)

상속을 통해 다른 클래스의 정보를 물려 받아 사용할 수 있음

  • 기반 클래스 (Base)
  • 파생 클래스 (Derived) : c++의 경우 여러 명의 부모를 가질 수 있어 파생

  • Derived의 생성자는 초기화 리스트에서 Base 생성자를 호출해서 Base의 생성을 먼저 처리한 후에, Derived의 생성자가 실행됨.
#include <iostream>
#include <string>

class Base {
  std::string s;

 public:
  Base() : s("기반") {  std::cout << "기반 클래스" <<  std::endl; }

  void what() {  std::cout << s <<  std::endl; }
};
class Derived : public Base {
  std::string s;

 public:
  Derived() : Base(), s("파생") {
     std::cout << "파생 클래스" <<  std::endl;

    // Base 에서 what() 을 물려 받았으므로
    // Derived 에서 당연히 호출 가능하다
    what();
  }
};
int main() {
   std::cout << " === 기반 클래스 생성 ===" <<  std::endl;
  Base p;

   std::cout << " === 파생 클래스 생성 ===" <<  std::endl;
  Derived c;

  return 0;
}

출력 결과는 위와 같음.
Derived의 what 함수를 호출했을 때, what 함수는 Base에 정의되어 있기 때문에 Base s가 출력된 것!
Derived 안에서 what을 호출하면 마지막 line 파생으로 출력할 수 있음.

public:
Derived() : Base(), s("파생") {
     std::cout << "파생 클래스" <<  std::endl;

    // Base 에서 what() 을 물려 받았으므로
    // Derived 에서 당연히 호출 가능하다
    what();
  }

  void what() {  std::cout << s <<  std::endl; }
  • 이런 경우, 함수 이름이 같지만 다른 클래스에 정의되어 있는 것이기 때문에 다른 함수로 취급 (만약 Derived 안에 what이 2개 정의되어 있다면 error)
  • 즉, Derived의 what 함수가 Base의 what 함수를 오버라이딩 한 것

protected

상속받는 클래스에서는 접근 가능하고, 그 외의 기타 정보는 접근 불가능

  • public
    외부에서 접근 가능

  • private
    외부에서 접근 불가능하며, 자기 자신의 class에서만 접근 가능

  • protected
    외부에서 접근 불가능하지만, 상속받은 경우 접근 가능

    private < protected < public 수준의 상속 정도

class 상속 접근 지시자

class Derived : public Base
  • public
    public 형태로 상속하였다면, 파생 클래스 입장에서 public은 그대로 public, protected는 그대로 protected, private는 그대로 private
  • protected
    protected 로 상속하였다면 파생 클래스 입장에서 public 은 protected 로 바뀌고 나머지는 그대로 유지
  • private
    private 으로 상속하였다면 파생 클래스 입장에서 모든 접근 지시자들이 private
#include <iostream>
#include <string>

class Base {
 public:
  std::string parent_string;

  Base() : parent_string("기반") { std::cout << "기반 클래스" << std::endl; }

  void what() { std::cout << parent_string << std::endl; }
};
class Derived : private Base {
  std::string child_string;

 public:
  Derived() : child_string("파생"), Base() {
    std::cout << "파생 클래스" << std::endl;
  }

  void what() { std::cout << child_string << std::endl; }
};
int main() {
  Base p;
  // Base 에서는 parent_string 이 public 이므로
  // 외부에서 당연히 접근 가능하다.
  std::cout << p.parent_string << std::endl;

  Derived c;
  // 반면에 Derived 에서는 parent_string 이
  // (private 상속을 받았기 때문에) private 이
  // 되어서 외부에서 접근이 불가능하다.
  std::cout << c.parent_string << std::endl;

  return 0;
}

따라서 위와 같은 경우, parent_string이 private 상속을 받았기 때문에 private이 되어서 외부에서 접근 불가능

0개의 댓글