[C++] 다중 상속, 가상 상속
여러모로 골치아픈부분을 많이 끼고 있는 c++이지만 그 중에서도 유별난 것이 바로 다중상속이다.
자바같은 경우는 실제적인 값을 가지지 않는 인터페이스라는 틀을 통해 다중상속 개념을 사용해서 별다른 부작용이 없는데,
C++은 그렇지가 않다...
다중상속은 한번만 세대가 내려왔을 때는 아무런 문제가 없다. 문제는 할아버지-손자 단계까지 내려오면서 손자가 자식들 중 둘 이상을 상속받을 경우 발생한다.
생각해보자. 자식은 부모의 생성자를 불러와서 초기화를 해야할 의무가 있다.
할아버지 클래스와, 자식 클래스 두개, 이 두개를 상속받는 손자클래스가 있다고 치자.
자식클래스들은 할아버지 클래스를 상속받으므로 할아버지의 생성자를 불러와서 초기화를 행해야 한다.
그런데 손자가 자식 둘을 전부 상속받는다. 자식 둘의 생성자를 불러와서 초기화를 행할 것이다. 여기서 문제가 발생한다.
손자는 자식1에게 초기화할 값을 보낼 것이다. 그럼 자식1은 당연히 그 값을 바탕으로 또 할아버지를 불러와서 초기화를 시킬 것이다. 여기까진 괜찮다.
자식2는 손자에게서 초기화할 값을 받고 다시 할아버지를 초기화할 것이다. 이렇게 되면 할아버지가 2번이나 초기화가 되는 상황이 벌어진다.
일단 이 상황을 코드로 짜보면 이런 결과가 나온다.
컴파일러마다 구현의 차가 있을지는 모르겠지만, VS에서는 먼저 부른 자식이 할아버지를 초기화한다.
Tail 생성자에서 left와 right 생성자의 순서를 바꾸면 right에 전달된 값으로 초기화가 이루어진다.
에러 없이 실행은 된다만 상당히 비직관적이고 비논리적인 구조가 된다.
다행히도 이것을 위한 해결책이 존재한다. 바로 가상 상속이다.
가상으로 상속받은 클래스는 부모에 대한 초기화를 자신의 자식에게로 유예한다.
이러면 손자클래스인 Tail이 할아버지를 바로 초기화시킬 수가 있다.