[c++] 상속 - 추가 자료

파이톨치·2022년 5월 10일
0

대학수업

목록 보기
8/32

상속 복습

상속은 부모 클래스와 자식 클래스로 이루어진 것들이었다. 부모가 자식에게 자신의 함수와 멤버 변수를 주었다. 상속에서 주의할 점은 생성자/소멸자는 상속되지 않는다는 것이었다.

상속 주의점

Derived class (자식 클래스)는 멤버 변수를 상속 받는다. 하지만! 그들에 직접적으로 접근할 수 없다.

Base Class Private Member Functions : 이 함수들은 부모클래스 밖에서 접근할 수 없다.

Base Class Private Member Functions Impact : 멤버 변수는 간접적으로 접근할 수 있다. accessor 혹은 mutator를 통해서 말이다. accessor? 이거 간단하다. 그냥 변수에 접근 하는 함수를 말하는데 예를 들어, getValue와 같은 함수가 accessor이다. 또 mutator는 setValue같은 함수를 mutator라고 부른다.

이것은 합리적이다. 왜냐하면 Private 멤버 함수는 도와주는 역할을 해야하기 때문이다. 추상화 시킨 개념이 아니다. 이들은 분명히 클래스 안에서만 정의되어 있어야 한다.

protected : 이건 자식이 쓸 수 있는 변수와 함수를 말한다.

멤버 함수의 재정의

Redefinition of Member Functions : 함수를 재정의 한다니?? 오버로드 한다는 이야기인가? 새로운 멤버 함수를 선언을 포함한다고 한다. 응? 또한 상속된 멤버 함수 선언을 포함한다고 한다 응? 상속된 멤버 함수는 선언 되지 않는다 응?

Redefining vs Overloading

진짜 궁금한 내용이었다. 오버로드랑 어떻게 다른거지? Redifining이 정확히 뭐지?

전혀 다르다고 한다. 내가 볼땐 비슷한데... Redefining in derived class 는 같은 파라미터 list를 가진다고 한다. 음! 오버로딩을 할 때는 파라미터가 달라졌으니 이 점은 분명히 다른 점이다! 그리고 본질적으로 같은 함수를 다시 쓰는 것에 불과하다고 한다.

반면에 오버로딩은 다른 파라미터 리스트를 가지고 새로운 함수에 대한 정의라고 한다.

Accessing Redefined Base Function

재 정의를 할 때, base class(부모 클래스)의 정의는 사라지지 않는다고 한다. 예시 코드를 보면 다음과 같다.

Employee JaneE; 
HourlyEmployee SallyH;
JaneE.printCheck(); // calls Employee’s printCheck
SallyH.printCheck(); // calls HourlyEmployee printCheck 
SallyH.Employee::printCheck(); // Calls Employee’s printCheck

다음과 같이 자식 클래스 것들 쓸 수도 있고 부모 클래스 것도 쓸 수 있다. 근데 사실 부모 클래스 것을 쓸 일은 잘 없지 않을까 싶다.

상속되지 않는 함수들

대부분의 함수들은 상속되지만 그들 중 일부는 상속되지 않는다.

어떤 것들이 있나 살펴보자.
우선 생성자와 소멸자이다. 앞에서 말했듯이 이들은 상속되지 않는다.
그리고 Copy constructor이다. 만약 정의 되지 않는다면 기본 값으로 생성된다고 한다.
그리고 Assignment operator이들은 상속에서 중요한 개념들이기 때문에 상속되지 않나보다. 이 친구도 정의 되지 않는다면 기본 값!

profile
안알랴줌

0개의 댓글