상속은 부모 클래스와 자식 클래스로 이루어진 것들이었다. 부모가 자식에게 자신의 함수와 멤버 변수를 주었다. 상속에서 주의할 점은 생성자/소멸자는 상속되지 않는다는 것이었다.
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 : 함수를 재정의 한다니?? 오버로드 한다는 이야기인가? 새로운 멤버 함수를 선언을 포함한다고 한다. 응? 또한 상속된 멤버 함수 선언을 포함한다고 한다 응? 상속된 멤버 함수는 선언 되지 않는다 응?
진짜 궁금한 내용이었다. 오버로드랑 어떻게 다른거지? Redifining이 정확히 뭐지?
전혀 다르다고 한다. 내가 볼땐 비슷한데... Redefining in derived class 는 같은 파라미터 list를 가진다고 한다. 음! 오버로딩을 할 때는 파라미터가 달라졌으니 이 점은 분명히 다른 점이다! 그리고 본질적으로 같은 함수를 다시 쓰는 것에 불과하다고 한다.
반면에 오버로딩은 다른 파라미터 리스트를 가지고 새로운 함수에 대한 정의라고 한다.
재 정의를 할 때, 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이들은 상속에서 중요한 개념들이기 때문에 상속되지 않나보다. 이 친구도 정의 되지 않는다면 기본 값!