-
Effective C++...38일지 2022. 8. 9. 09:31
다중 상속은 심사숙고해서 사용하자
다중 상속의 위험성과 해결 방법
기본적으로 다중 상속은 둘 이상의 동일한 이름의 함수를 물려받을 가능성이 존재하고 C++에서는 이 함수를 구분해주지 않는다. 이 것은 C++가 최적 일치 함수를 찾은 뒤 접근 가능성을 체크하기 때문인데 이 때문에 다음과 같이 명확하게 호출 가능한 게 하나밖에 없더라도 함수 호출 모호성 에러가 발생하게 된다.
class BorrowableItem {
public:
void checkOut();
}
class ElectronicGadget {
private:
bool checkOut() const;
};
class MP3Player : public BorrowableItem, public ElectronicGadget { ... };
MP3Player mp;
mp.checkOut(); // 모호성 에러 발생
다중 상속의 또다른 문제점은 상속받은 클래스들이 특정 기본 클래스에서 파생된 경우 기본 클래스의 멤버 변수가 중복해서 만들어질 수 있다는 것이다.
C++에서는 기본적으로 이러한 중복을 허용하고 중복을 막을 수 있도록 가상 상속을 허용하고 있으나 가상 상속은 크기가 더 크고 가상 기본 클래스의 멤버 접근 동작도 느리다는 단점을 가지고 있다.
※ 가상 기본 클래스를 사용해야 하는 경우 기본 클래스에 멤버 변수를 사용하지 않도록 해야 한다.
다중 상속이 유용하게 사용될 수 있는 예로는 순수 가상 함수를 public 인터페이스로 상속받고 is-implemented-in-terms-of 관계의 클래스를 private 상속으로 구현해야 할 때를 들 수 있다.
※ 단일 상속으로 구현하는 편이 더 나을 가능성이 높다.