C++ 다중 상속

다이아몬드 상속과 virtual base

다이아몬드 상속은 Base가 Left와 Right를 거쳐 Derived에 두 번 들어오는 구조입니다. virtual 상속을 쓰지 않으면 Base 부분 객체와 멤버 접근이 중복됩니다.

Base
Left
Right
Derived
01

Base 중복 확인

비가상 상속이면 Derived 안에 Left::Base와 Right::Base가 각각 생깁니다.

02

모호한 변환 찾기

Derived*를 Base*로 바꾸거나 Base::member에 접근할 때 경로가 둘이면 컴파일 오류가 납니다.

03

virtual base 적용

Left와 Right가 virtual public Base로 상속하면 Derived가 Base 부분 객체 하나를 공유합니다.

04

생성자 책임 점검

가상 기반 클래스는 가장 아래의 most-derived 생성자가 Base(args)를 직접 초기화합니다.

설계 점검

  • 상태가 있는 Base를 공유해야 할 때만 virtual 상속을 검토하고, 단순 기능 결합은 composition을 먼저 봅니다.
  • 인터페이스 기반 클래스는 상태 없이 순수 가상 함수와 virtual destructor를 두면 충돌이 줄어듭니다.
  • virtual base는 객체 레이아웃과 초기화 규칙을 복잡하게 만들며, 명시적 scope resolution은 중복 자체를 없애지는 않습니다.

키워드

virtualBase 부분 객체 공유
범위Left::Base 경로 지정
ctormost-derived가 Base 초기화