상속 설계 점검표

상속은 관계, 접근, 생명주기, 재정의를 함께 확인한다

예제의 `Dog : public Animal`은 public 인터페이스를 유지하면서 `displayInfo()`를 재정의한다. 단순 코드 재사용이 아니라 자연스러운 is-a 관계인지가 첫 판단 기준이다.

01
is-a 관계 파생 객체를 기반 타입으로 읽어도 의미가 깨지지 않는지 확인한다.
02
접근 지정자 `public`, `protected`, `private` 상속은 외부 노출 범위를 바꾼다.
03
생성/소멸 순서 기반 생성자 먼저, 파생 생성자 나중. 소멸은 반대 순서다.
04
재정의 의도 `virtual`과 `override`로 같은 인터페이스의 다른 구현을 드러낸다.
상속 방식 Base public Base protected Base private
public public 유지 protected 유지 직접 접근 불가
protected protected로 축소 protected 유지 직접 접근 불가
private private로 축소 private로 축소 직접 접근 불가
public inheritance 외부 코드가 기반 인터페이스를 계속 사용할 수 있다 `myDog.getName()`처럼 기반 클래스의 public 함수가 파생 객체에서도 자연스럽게 보인다.
protected data 파생 클래스 구현에서만 공유한다 `species`, `age`는 `Dog` 내부에서 사용할 수 있지만 외부 직접 접근은 막는다.
private 멤버 객체 안에는 존재하지만 파생 클래스가 이름으로 직접 접근하지 못한다.
override 시그니처가 어긋나면 컴파일러가 재정의 실패를 잡아준다.
다중 상속 강력하지만 모호성과 다이아몬드 구조를 따로 점검해야 한다.