C++ 상속 설계

상속 대체 가능성 검증

상속은 부모 구현을 가져오는 문법이지만 설계 기준은 is-a와 LSP다. 파생 객체가 base 타입 자리에 들어가도 전제 조건과 결과 보장이 깨지지 않는지 확인한다.

01

관계 판정

파생 클래스가 base의 모든 계약을 만족하는지 먼저 본다.

is-a 검증
02

접근 상속

public 상속은 인터페이스 보존, private 상속은 구현 재사용 성격이 강하다.

의미 차이
03

재정의 지점

변해야 하는 동작만 virtual로 열고 나머지는 안정된 non-virtual 인터페이스로 둔다.

NVI 패턴 후보
04

소멸 안전

base 포인터로 delete될 수 있으면 virtual destructor를 제공한다.

부분 파괴 방지
public
인터페이스 대체 Derived는 Base로 사용할 수 있어야 하며 pre/postcondition을 강화하지 않는다.
LSP
protected
파생 구현 접근 데이터 직접 노출은 base 표현 변경을 어렵게 만든다.
함수 보호 우선
private
구현 재사용 외부에서는 Base 관계가 보이지 않으므로 has-a 대안과 비교한다.
합성 검토
final
상속 확장 차단 더 이상 재정의되면 안 되는 클래스나 메서드에 의도를 표시한다.
최적화 힌트도 가능

계약 · 소멸자 · 합성 대안 점검

계약 파생 클래스가 base 함수의 예외, 범위, 결과 보장을 약하게 만들지 않는지 본다.
소멸자 다형 base에 virtual destructor가 없으면 삭제 경로를 점검한다.
합성 대안 단지 일부 함수를 재사용하려는 상속이면 멤버 객체로 바꾸는 편이 나은지 검토한다.