다중상속은 심사숙고해서 사용하자

Bogoomi·2022년 7월 16일
0

EffectiveC++

목록 보기
21/24

항목40 - 다중상속은 심사숙고해서 사용하자



요약
C++의 컴파일러는 최적 일치 함수를 찾은 후에 비로소 함수의 접근가능성을 점검한다.
다중상속을 하게 되면 컴파일러가 난처한 상황이 생긴다.

  1. 함수의 모호성
    두 개의 클래스를 상속받은 파생 클래스가 서로 다른 부모클래스의 이름이 같은 함수를 호출할 때,
    컴파일러는 어떤 부모클래스 함수를 사용했는지 모른다. 때문에 컴파일 에러가 생긴다.

  2. 멤버 변수의 모호성
    기본 클래스와 파생 클래스 사이의 경로가 두 개 이상 되는 상속 계통이 생기면
    '죽음의 MI 마름모꼴'(deadly MI diamond)문제가 생기게 된다.
    이건 가상 상속으로 해결 가능! 데이터멤버를 가진 클래스를 가상 기본 클래스로 만드는 것.

예시코드

class File { ... };
class InputFile: virtual public File { ... };
class OutputFile: virtual public File { ... };
class IOFile: public InputFile, public OutputFile { ... };

정확한 동적 관점에서 보면 public 상속은 반드시 항상 가상 상속이어야하는것 맞다.
하지만, 가상상속은 비싸다(메모리값이 더 든다, 속도가 느리다, 코드가 복잡해진다 등등).
때문에 가상 기본 클래스는 필요하면 쓰고 왠만하면 비가상 상속을 기본으로 삼자.
가상 기본 클래스를 꼭 써야만 한다면 데이터를 넣지 않는 쪽으로 최대한 신경을 쓰자.



잊지말자!

  • 다중 상속은 단일 상속보다 복잡하다. 새로운 모호성 문제를 일으킬 뿐만 아니라 가상 상속이 필요해질 수도 있음
  • 가상 상속은 비싸다. 때문에 가상 기본 클래스에는 데이터를 두지 않는 것이 좋다.
  • 다중 상속을 적법하게 쓰는 법은 인터페이스 클래스로부터 public 상속을 시킴과 동시에 구현을 돕는 클래스로부터 private 상속을 시키는 것
profile
개에에에바알

0개의 댓글