가상 상속

다이아몬드 상속 판단

B와 C가 A를 상속하고 D가 B와 C를 상속하면 A 부분 객체가 두 개 생길 수 있으며, virtual inheritance는 이를 하나로 공유하지만 초기화와 비용 규칙이 달라진다.

01

공통 기반

Base A가 있고 B, C가 각각 A를 상속한다.

top
02

합류 클래스

D가 B와 C를 동시에 상속하면 A 경로가 두 개 생긴다.

diamond
03

중복 문제

D에서 A::x에 접근할 때 B::A인지 C::A인지 모호해진다.

ambiguity
04

virtual base

B와 C가 virtual로 A를 상속하면 D 안의 A는 하나만 존재한다.

shared base
non-virtual
A 부분 객체 두 개 상태가 두 벌 생기므로 의도적으로 분리해야 할 때만 허용한다.
duplicated state
virtual base
A 부분 객체 하나 최종 파생 클래스 D가 virtual base A를 초기화할 책임을 가진다.
most-derived init
cast ambiguity
A로의 변환 경로가 두 개 static_cast<A*>가 모호해질 수 있고 명시 경로가 필요하다.
경로
composition
상속 대신 멤버 조합 상태 공유와 역할 조합이 목적이면 composition이 더 단순할 수 있다.
prefer simpler

다이아몬드 상속 사용 전 질문

진짜 is-a? 다중 상속이 타입 관계인지 기능 조합인지 구분한다.
상태 중복 공통 기반의 데이터가 두 벌이면 의미가 깨지는지 확인한다.
초기화 virtual base 생성자 인자를 최종 파생 클래스가 책임지는지 코드로 확인한다.