C++ 다중 상속

다중 상속 충돌

다중 상속은 여러 인터페이스 조합을 한 타입에 모으지만 데이터 base가 겹치면 모호성과 중복 subobject가 생긴다. virtual inheritance가 필요한지 먼저 상속 그래프를 그린다.

01

상속 그래프

base가 상태를 갖는지, 같은 조상이 여러 경로로 들어오는지 확인한다.

diamond 탐지
02

역할 분리

상태 없는 인터페이스 조합인지 구현 재사용인지 목적을 나눈다.

mixin은 가벼움
03

모호성 해결

같은 이름 멤버가 여러 base에 있으면 scope qualifier나 using으로 의도를 밝힌다.

컴파일 오류 후보
04

가상 상속

공유 base가 하나만 있어야 하면 virtual inheritance로 subobject를 통합한다.

생성 책임 변화
diamond
Base가 두 번 포함 D가 B와 C를 상속하고 둘 다 A를 상속하면 A subobject가 둘 생길 수 있다.
상태 중복
virtual base
공유 base 하나 가장 파생 클래스가 virtual base 생성 책임을 갖는다.
초기화 순서 점검
name lookup
멤버 이름 모호성 두 base에 같은 이름이 있으면 어떤 함수를 부를지 명시해야 한다.
using 선언
composition
대안 설계 역할 충돌이 많으면 상속보다 멤버 객체 조합이 더 단순하다.
테스트 용이

상태 base · 소멸자 · 명시성 점검

상태 base 다중 상속된 base가 데이터를 갖고 있으면 중복과 초기화 순서를 특별히 본다.
소멸자 여러 base 중 다형 삭제 경로가 있는 base는 virtual destructor가 필요하다.
명시성 모호한 호출을 우연히 해결하지 말고 scope로 선택 의도를 남긴다.