C++의 다이아몬드 상속은 C++를 다뤄본 학생/프로그래머라면 한 번쯤 경험하거나 들어봤을 개념이다. 하지만 가상 상속이 어떻게 다이아몬드 상속 문제를 해결하는지 오랫동안 와닿지 않았다. 이를 잘 설명하는 좋은 글을 발견해서 해당 내용을 소개하고자 한다.
class A { public: void eat(){ cout<<"A";} };
class B: virtual public A { public: void eat(){ cout<<"B";} };
class C: virtual public A { public: void eat(){ cout<<"C";} };
class D: public B,C { public: void eat(){ cout<<"D";} };
int main(){
A *a = new D();
a->eat();
}
다이아몬드 상속에 대해 묻는 글에서 질문자는 위의 예시 코드를 제시하며 어떻게 가상 상속이 동작하는지 질문했다.
위의 코드에 대해 스택 오버플로의 유저 nnovich-OK는 아래와 같은 질문을 추가적으로 하며 답변을 시작한다.
답변의 핵심은, class B: virtual A의 의미는 B를 상속받는 클래스가 A의 생성을 책임진다는 것이다.
그렇기에 위의 세 가지 질문에 대한 답은 아래와 같다.