[Study Note]C++ 상속 #163
jinlee0310
started this conversation in
Blog
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
TL;DR
이 글은 씹어먹는 C++ 6-1의 내용을 정리 및 요약한 글입니다.
사원 관리 프로그램
회사 사원들의 월급을 계산해서 한달에 총 얼마를 월급으로 지출하는 지 알려주는 프로그램을 만드려고 한다.
사원들의 필요한 데이터는 이름, 나이, 직책, 직책 순위로 구성된다.
Employee를 만들었으니 Employee 객체들을 관리할 수 있는 EmployeeList 클래스를 만들어보자.이 변수들을 통해 사원 데이터를 처리할 것이다.
alloc_employee는 할당된 크기를 알려주는 배열이고 curren_employee는 현재 employee_list에 등록된 사원 수이다.
employee_list가 Employee** 타입인 이유는 이를 Employee* 객체를 담는 배열로 사용할 것이기 때문이다.
cf). 이부분에 대해서
new Employee*[alloc_employee]라는 코드는 현대에는 잘 쓰이지 않는다. 현대에는 스마트 포인터와 vector를 사용하여 코드를 작성한다.사원을 추가하는 함수는 아래처럼 구성한다.
전체 코드
여기에서 차장 이상 급은 관리 데이터에 근속 년수를 포함시켜서 월급에 추가해달라는 요청사항이 생긴다.
이를 위해 매니저 클래스를 만든다.
기존의 Employee 클래스와 같고 year_of_service만 추가 되었다.
그리고 이를 위해 employee_list와 manage_list를 따로 구분해야 한다.
상속(Inheritance)
C++에서는 상속을 통해 다른 클래스의 내용을 그대로 포함할 수 있는 작업을 가능하게 해준다. 상속을 통해 다른 클래스의 정보를 물려받아서 사용할 수 있다.
class Derived : public Base는 Derived가 Base를 public 형식으로 상속받겠다는 의미가 된다.따라서 Derived 클래스에서 what을 호출할 수 있다.
Derived의 생성자는 초기화 시트르에서 기반 생성자를 호출해서 기반 생성을 먼저 한 후 Derived의 생성자가 실행되어야 한다. 기반 클래스의 생성자를 명시적으로 호출하지 않을 경우 기반 클래스의 디폴트 생성자가 호출된다.
기반 클래스가 생성될 때는 정상적으로
기반 클래스라고 출력된다.파생 클래스가 생성될 때는 Base가 먼저 초기화 되면서
기반 클래스가 출력되고 그 다음파생 클래스가 출력되고 what을 호출하게 된다. what을 호출했을 때기반이 출력된 이유는 what 함수는 Base에 정의되어 있기 때문에 Base의 s가 출력되어기반이라고 나오는 것이다.그렇다면 만약 Derived에서 what을 정의해준다면?
이번에는 Derived 클래스에 Base와 같은 기능을 하는 what을 정의하였다. 이 경우 Derived를 초기화 할 때 what을 호출하면 Derived의 what을 호출하게 되어
파생을 출력하게 된다.이런 것을 가리켜 오버라이딩이라고 한다. Derived의 what 함수가 Base의 what 함수를 오버라이딩 한 것이다.
protected
기본적으로 private 멤버 변수 혹은 멤버 함수는 어떠한 경우에서도 자기 클래스 말고는 접근할 수 없다.
하지만 종종 파생 클래스에서 기반 클래스의 데이터에 직접 접근할 필요성이 있다.
예를 들면 위에서 Employee 클래스를 기반으로 하여 Manager 클래스를 만든다면 name이나 age에 접근할 필요성이 있다.
C++에서는 private과 public의 중간인 protected를 이용하여 중간 위치에 있는 접근 지시자를 지원한다.
이 키워드는 상속 받는 클래스에서는 접근 가능하고 그 외의 곳에서는 접근 불가능하다.
위 코드에서 protected로 선언된 parent_string은 파생 클래스인 Derived에서 접근이 가능하다.
또한
class Derived : public Base에서사원 관리 프로그램에 적용하기
All reactions