Virtual Base Init

가상 기반 클래스는 최종 파생 클래스가 초기화한다

virtual public으로 공유 기반 클래스를 하나만 만들면, 중간 클래스의 생성자 호출보다 최종 객체를 만드는 생성자가 더 중요한 책임을 갖습니다.

공유 상태 Device 하위 객체는 한 번만 존재
호출 책임 SmartPhone이 Device 생성자 인자를 결정
검증 지점 중복 멤버와 모호한 호출이 사라졌는지 확인
constructor list

최종 파생 생성자에서 공유 기반을 명시

class SmartPhone : public Phone, public Camera { public: SmartPhone() : Device("mobile"), Phone(), Camera() {} };

Phone과 Camera가 Device를 가상 상속해도, 실제 Device 초기화는 SmartPhone이 맡습니다.

object layout

객체 내부에는 공유 기반이 하나만 남음

SmartPhone ├─ Device // shared ├─ Phone └─ Camera

중복된 Device 상태가 없어지므로 name 같은 멤버 접근도 한 경로로 정리됩니다.

01

가상 기반

Device가 먼저 한 번 초기화됩니다.
02

직접 기반

Phone과 Camera의 생성자가 차례로 실행됩니다.
03

멤버 객체

SmartPhone의 멤버 변수가 선언 순서대로 초기화됩니다.
04

생성자 본문

마지막으로 SmartPhone 생성자 본문이 실행됩니다.
검토

가상 상속 초기화 책임

다이아몬드 문제를 해결한 뒤에도 초기화 인자가 흩어져 있으면 코드를 읽기 어렵습니다. 최종 파생 클래스가 공유 기반의 의미를 명확히 드러내야 합니다.

인자 출처 Device 생성자 인자가 최종 타입에서 보이는가?
중복 상태 공유 기반 멤버가 한 번만 저장되는가?
대안 비교 합성으로 더 단순하게 표현할 수 없는가?