Abstract Design

추상 클래스는 계약과 공통 구현의 경계를 정한다

순수 가상 함수는 반드시 구현해야 할 약속을 만들고, 일반 멤버 함수는 계층 전체가 공유할 기본 동작을 담습니다.

계약 파생 클래스가 구현해야 하는 함수
공통 코드 중복을 줄이는 기본 동작
수명 기반 포인터 삭제를 안전하게 처리
abstract base

추상 기반 클래스

class Shape { public: virtual double area() const = 0; std::string name() const; virtual ~Shape() = default; };

일부 함수는 계약으로 강제하고, 일부 함수는 공통 구현으로 제공할 수 있습니다.

interface style

순수 계약형 인터페이스

class ILogger { public: virtual void log(std::string_view) = 0; virtual ~ILogger() = default; };

상태와 구현을 거의 두지 않고, 사용할 수 있는 동작의 이름만 약속합니다.

Pure virtual 파생 클래스가 직접 채워야 하는 핵심 동작을 명시합니다.
Default behavior 모든 파생 클래스에 공통인 흐름은 기반 클래스에 한 번만 둡니다.
Virtual dtor 기반 포인터로 삭제될 가능성이 있으면 소멸자 체인을 보장합니다.
Design Questions

기반 타입에 넣을 책임을 줄여 봅니다

추상 클래스가 너무 많은 상태와 정책을 가지면 파생 클래스가 불필요한 결합을 떠안습니다. 계약, 기본 동작, 소유권을 분리해서 검토합니다.

필수 구현인가? 모든 파생 타입이 반드시 다르게 구현해야 하는가?
공유 가능한가? 중복 구현을 줄이는 기본 함수로 둘 수 있는가?
삭제 경로는? 기반 포인터를 통해 delete될 수 있는가?