역할 분류
두 기반 클래스가 순수 인터페이스에 가까운지, 상태를 가진 구현 클래스인지 먼저 구분한다.
여러 기반 클래스를 상속하면 인터페이스 조합은 쉬워지지만 이름 충돌, 다이아몬드 구조, 수명 경로가 복잡해진다. 작은 인터페이스 조합인지 먼저 확인해야 한다.
두 기반 클래스가 순수 인터페이스에 가까운지, 상태를 가진 구현 클래스인지 먼저 구분한다.
같은 함수 이름이나 공통 기반이 있으면 범위 지정과 virtual inheritance 필요성을 검토한다.
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 { /* 역할 구현 */ };