이제껏 다룬 inheritance는 모두 single inheritance였다
하지만 c++에서는 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의 상속관계 일때 나타난다
이에 대해서는 추후 자세하게 다룬다
많은 프로그래머들은 다중상속은 지양해야한다고 믿는다
하지만 그렇다고 아예 쓰지 않는 것은 아니다
iostream의 object인 std::cin std::cout은 multiple inheritance로 구현되었다