몇몇 프로그래밍 언어에서 다중 상속을 지원할지 단일 상속을 지원 할지, 프로그래밍 언어가 상속을 어디까지 지원해 주는게 좋을지 논쟁이 계속 되고 있다고 한다. 이 논쟁을 우리도 함께 해보자는 취지로 만들어진 항목이 바로 More Exeptional C++ 24항목에 나와 있다.
1. 다중 상속(MI)은 무엇이고, MI를 C++에 도임함으로써 생길 수 있는 가능성이나 문제점에는 무엇이 있나?
다중 상속 그림
위 그림이 바로 다중 상속(MI)을 아주 잘 보여주고 있다. Bat 은 Mammalia 와 Bird 를 상속하므로써 MI 다. 라고 말할 수 있다. 문제점은 그림에서 봤듯이 Bat 은 간접적으로 Animal 을 두개 가지게 되는 문제가 생긴다.(이런 간접적인 두개일 경우 문제로 지적되는 것이 바로 초기화 문제를 들 수 있다. 어느 Animal 이 초기화 되는거지!? 란 문제에 봉착되게 된다.)
이걸 책에선 "죽음의 다이아몬드, 공포의 다이아몬드" 라고 한다.
2. MI가 정말 필요한가? 필요한 사례를 최대한 찾아보고, MI를 지원해야 하는 이유를 설명하라, 필요 없다면, 단일 상속(SI)이 MI의 역활을 다하거나 훨씬 잘 할 수 있는 이유를 설명하고 C++ 에서 MI를 지원해야 하는 이유를 설명하라.
MI는 정말 필요하다. 그 대표적인 경우가, 두개의 독립적인 라이브러리에 있는 클래스를 합치고자 할 때, .. 답은 상속 밖에 없기 때문이다. 하지만 잘 사용 하지 못한다면, 사용하지 않는게 오히려 더 좋다. 그렇다면 의견이 하나로 모아진다.
어떻게 하면 MI를 잘 사용 할 수 있을까?
책에서 설명하는 MI를 잘 사용 하는 방법은 3가지로 요약이 된다.
첫째, 모듈 또는 라이브러리 합치기 위해서 사용
앞에서 말했다 시피, 두개의 독립적인 라이브러리에 있는 클래스를 각각 1개씩 상속하여, 하나의 클래스를 만들고자 할 땐, MI밖에 답이 없다. 이 하나의 클래스로 만들어 찍어낸 객체는 두개의 독립적인 라이브러리에서 마치 상속 해준 녀석 처럼 잘 돌아 갈 수 있기 때문이다. 결국 .. 다중 상속 밖에 답이 없다.
둘째, 프로토콜 클래스(인터페이스 클래스)를 사용하기 위해서 사용
클래스는 데이터가 전혀 없고, 오로지 추상 함수로만 이루어져 있다고 했을 때, 이 클래스를 MI로 사용 하는건 다른 MI 상속보다 안전하다고 할 수 있다. 최소한 ... 데이터 초기화 문제에 대해서 손 때도 되기 때문이다.
자바나 COM 언어에서도 이런것만 지원하는 것을 보면, 그 만큼 인정 되는 사항으로 판단 된다.
책에선 셋째도 있으나, 첫째와 둘째의 공통된 점을 말하는 것으므로 생략 한다.
총평
죽음의 다이아몬드 상속이라 말할 말큼 악명이 높은 녀석이니 ... 반드시 참고 해야 할 사항으로 생각 된다.
'책 정리 > More Exceptional C++' 카테고리의 다른 글
항목 12 : inline ( 난이도 : 4 ) (0) | 2008.12.17 |
---|---|
항목 28 : 다형성 제어하기 ( 난이도 : 3 ) (0) | 2008.12.16 |
항목 27 : (비)순수 가상 함수 ( 난이도 : 7 ) (0) | 2008.12.16 |
항목 26 : 다중 상속과 샴 쌍둥이 문제 ( 난이도 : 4 ) (0) | 2008.12.16 |
항목 25 : 다중 상속 에뮬레이션 ( 난이도 : 5 ) (0) | 2008.12.16 |
항목 31 : 스마트 포인터 멤버 Part 2 : ValuePtr을 향해 ( 난이도 : 6 ) (0) | 2008.12.14 |
항목 30 : 스마트 포인터 멤버 Part 1 : auto_ptr로 인해 생길 수 있는 문제 ( 난이도 : 5 ) (0) | 2008.12.14 |
항목 29 : auto_ptr 사용 하기 (난이도 : 5) (0) | 2008.12.14 |
항목 35 : #define (난이도 : 4) (0) | 2008.12.13 |
항목 34 : 전처리 매크로 ( 난이도 : 4 ) (0) | 2008.12.13 |
최근댓글