Multiple Inheritance

다중 상속 모호성

여러 기반 클래스를 상속하면 인터페이스 조합은 쉬워지지만 이름 충돌, 다이아몬드 구조, 수명 경로가 복잡해진다. 작은 인터페이스 조합인지 먼저 확인해야 한다.

01

역할 분류

두 기반 클래스가 순수 인터페이스에 가까운지, 상태를 가진 구현 클래스인지 먼저 구분한다.

02

모호성을 드러낸다

같은 함수 이름이나 공통 기반이 있으면 범위 지정과 virtual inheritance 필요성을 검토한다.

03

생성 책임 검토

virtual base는 가장 파생된 클래스가 초기화하므로 생성자 경로를 다시 확인한다.

인터페이스 조합
상대적으로 안전 상태 없는 작은 interface 여러 개를 구현하는 형태는 이해하기 쉽다.
Java식 역할 구현과 비슷하게 쓴다.
구현 상속
충돌 가능성 두 기반이 상태와 구현을 모두 가지면 초기화와 이름 해석이 복잡해진다.
합성을 강하게 고려한다.
diamond
공통 기반 중복 A를 상속한 B와 C를 D가 함께 상속하면 A 부분이 둘 생길 수 있다.
공유가 필요하면 virtual base를 쓴다.
virtual base
초기화 규칙 변화 공통 기반은 최종 파생 클래스가 한 번 초기화한다.
생성자 호출 순서를 문서화한다.

상태 보유 · 이름 충돌 · 합성 비교 점검

상태 보유 두 기반 클래스가 모두 데이터를 가진다면 객체 레이아웃과 초기화 책임을 설명할 수 있는가.
이름 충돌 동일한 함수명을 호출할 때 어느 기반의 함수인지 명확한가.
합성 비교 멤버 객체 두 개로 위임하면 더 단순하게 표현되지 않는가.

역할 인터페이스 조합

class Drawable { public: virtual ~Drawable() = default; virtual void draw() = 0;
        overflow-wrap: break-word;
        word-break: keep-all;
      };
class Clickable { public: virtual ~Clickable() = default; virtual void click() = 0; };
class Button : public Drawable, public Clickable { /* 역할 구현 */ };