ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 상속으로 구현해야 할 때를 들 수 있다.

     

    ※ 단일 상속으로 구현하는 편이 더 나을 가능성이 높다.

     

    댓글

Designed by Tistory.