17.9 Multiple inheritance

주홍영·2022년 3월 20일
0

Learncpp.com

목록 보기
170/199

https://www.learncpp.com/cpp-tutorial/multiple-inheritance/

이제껏 다룬 inheritance는 모두 single inheritance였다
하지만 c++에서는 multiple inheritance도 지원하고 있다
이는 복수의 클래스에서 상속받을 수 있는 것이 가능하다는 것을 의미한다

Problems with multiple inheritance

언뜻 보기에는 간단해 보이나 다중상속은 프로그램을 복잡하고 유지하기 어렵게 만든다

첫째, 모호성이 발생할 수 있다. 예를 들어 두개의 parent에 똑같은 함수가 존재할 때 말이다
이런 경우에 compiler error가 발생한다

#include <iostream>

class USBDevice
{
private:
    long m_id {};

public:
    USBDevice(long id)
        : m_id { id }
    {
    }

    long getID() const { return m_id; }
};

class NetworkDevice
{
private:
    long m_id {};

public:
    NetworkDevice(long id)
        : m_id { id }
    {
    }

    long getID() const { return m_id; }
};

class WirelessAdapter: public USBDevice, public NetworkDevice
{
public:
    WirelessAdapter(long usbId, long networkId)
        : USBDevice { usbId }, NetworkDevice { networkId }
    {
    }
};

int main()
{
    WirelessAdapter c54G { 5442, 181742 };
    std::cout << c54G.getID(); // Which getID() do we call?

    return 0;
}

위의 코드를 실행하면 두 parent class에 모두 getID()가 존재하므로 compile error발생

하지만 이를 우회하는 방법이 있다. 명시적으로 function call을 지정해주는 것이다

int main()
{
    WirelessAdapter c54G { 5442, 181742 };
    std::cout << c54G.USBDevice::getID();

    return 0;
}

위와 같이 USBDevice::를 통해 어떠한 함수인지 명시적으로 설정해서 error를 피할 수 있다
이렇게 보면 간단해 보이나 클래스가 커지고 무거워질 수록 더 이상 간단해지지 않게 된다

둘째, diamond problem 이 발생한다

위와 같이 diamond shape의 상속관계 일때 나타난다
이에 대해서는 추후 자세하게 다룬다

Is multiple inheritance more trouble than it’s worth?

많은 프로그래머들은 다중상속은 지양해야한다고 믿는다
하지만 그렇다고 아예 쓰지 않는 것은 아니다
iostream의 object인 std::cin std::cout은 multiple inheritance로 구현되었다

profile
청룡동거주민

0개의 댓글