17.9 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로 구현되었다
Author And Source
이 문제에 관하여(17.9 Multiple inheritance), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ikmy0ung/17.9-Multiple-inheritance저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)