요약
C++의 컴파일러는 최적 일치 함수를 찾은 후에 비로소 함수의 접근가능성을 점검한다.
다중상속을 하게 되면 컴파일러가 난처한 상황이 생긴다.
함수의 모호성
두 개의 클래스를 상속받은 파생 클래스가 서로 다른 부모클래스의 이름이 같은 함수를 호출할 때,
컴파일러는 어떤 부모클래스 함수를 사용했는지 모른다. 때문에 컴파일 에러가 생긴다.
멤버 변수의 모호성
기본 클래스와 파생 클래스 사이의 경로가 두 개 이상 되는 상속 계통이 생기면
'죽음의 MI 마름모꼴'(deadly MI diamond)문제가 생기게 된다.
이건 가상 상속으로 해결 가능! 데이터멤버를 가진 클래스를 가상 기본 클래스로 만드는 것.
예시코드
class File { ... };
class InputFile: virtual public File { ... };
class OutputFile: virtual public File { ... };
class IOFile: public InputFile, public OutputFile { ... };
정확한 동적 관점에서 보면 public 상속은 반드시 항상 가상 상속이어야하는것 맞다.
하지만, 가상상속은 비싸다(메모리값이 더 든다, 속도가 느리다, 코드가 복잡해진다 등등).
때문에 가상 기본 클래스는 필요하면 쓰고 왠만하면 비가상 상속을 기본으로 삼자.
가상 기본 클래스를 꼭 써야만 한다면 데이터를 넣지 않는 쪽으로 최대한 신경을 쓰자.
잊지말자!