2. error C2385 : 'checkOut' 액세스가 모호합니다.
'BorrowableItem'의 'checkOut'일 수 있습니다.
'ElectronicGadget'의 'checkOut'일 수 있습니다.
다중 상속으로 인한 모호성
눈으로 봐도 애매하다
3. error C2385 : 'checkOut' 액세스가 모호합니다.
'BorrowableItem'의 'checkOut'일 수 있습니다.
'ElectronicGadget'의 'checkOut'일 수 있습니다.
다중 상속으로 인한 모호성
눈으로 봤을 때는
ElectronicGadget 의
함수에 접근 권한이
없기 때문에 잘 동작
할 것 처럼 보인다
4. 다중 상속으로 인한 모호성
C++ 컴파일러는 호출에 대해 최적으로 일치하는 함수를 먼저 찾은
다음에 그 함수에 접근 할 수 있는 지를 체크한다 그래서 앞의
상황에서 컴파일러는 오류를 출력한다
호출할 함수를 명시적으로 지정해준다면 모호성을 해결할 수 있다
5. 죽음의 MI 마름모꼴
Deadly MI(multiple inheritance) diamond
File
InputFile OutputFile
IOFile
6. 죽음의 MI 마름모꼴
error C2385: 'm_FileName' 액세스가 모호합니다.
기본 'File'의 'm_FileName'일 수 있습니다.
또는 기본 'File'의 'm_FileName'일 수 있습니다.
기본 클래스 File 이 중복되어
생성되었음을 알 수 있다
7. 가상 상속
중복되는 클래스를
가상 기본 클래스로 만들면
문제를 해결 할 수 있다
단, 가상 상속을 받은 클래스는
데이터가 더 크며
기본 데이터 멤버에 접근하는
속도가 느리다
8. 표준 C++ 라이브리에 있는 가상 상속
This class inherits all members from its two basic_istream and
basic_ostream (using virtual inheritance), thus being able to
perform both input and output operations.
basic_ios
basic_istream Basic_ostream
basic_iostream
12. 가상 기본 클래스 초기화 문제
1. 초기화가 필요한 가상 기본 클래스로부터 클래스가 파생된 경우,
이 파생 클래스는 가상 기본 클래스와의 거리에 상관없이 가상 기본
클래스의 존재를 염두에 두고 있어야 한다
2. 기존의 클래스 계통에 파생 클래스를 새로 추가할 때도 그 파생
클래스는 가상 기본 클래스(역시 거리에 상관 없이)의 초기화를
떠맡아야 한다
결론
1. 구태여 쓸 필요가 없으면 가상 기본 클래스를 사용하지 마라
2. 가상 기본 클래스를 정말 써야 하는 상황이라면 가상 기본
클래스에는 데이터를 넣지 않는 쪽으로 하라
13. 권장하는 다중 상속 방법
한 클래스로부터 인터페이스 상속을 받고 다른 클래스로부터 구현
상속을 받는다
인터페이스를 가져오고자 하는 클래스
17. 이것만은 잊지 말자!
• 다중 상속은 단일 상속보다 확실히 복잡합니다 새로운 모호성
문제를 일으킬 뿐만 아니라 가상 상속이 필요해질 수도 있습니다
• 가상 상속을 쓰면 크기 비용, 속도 비용이 늘어나며, 초기화 및 대입
연산의 복잡도가 커집니다 따라서 가상 기본 클래스에는 데이터를
두지 않는 것이 현실적으로 가장 실용적입니다
• 다중 상속을 적법하게 쓸 수 있는 경우가 있습니다 여러 시나리오 중
하나는 인터페이스 클래스로부터 public 상속을 시킴과 동시에
구현을 돕는 클래스로부터 private 상속을 시키는 것입니다