C++ Chapter 11.8 : 다중 상속
카테고리: Cpp
태그: Cpp Programming
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!
chapter 11. 상속 : 다중 상속
🔔 다중 상속 코드
class USBNetworkDevice : public USBDevice, public NetworkDevice
USBNetworkDevice
클래스는 부모 클래스가 2개다.USBDevice
클래스에서도 상속받고NetworkDevice
클래스에서도 상속 받는다.
- Java는 다중 상속을 지원하지 않지만(인터페이스만 허용) C++는 다중 상속을 지원한다.
📜USBDevice 클래스
class USBDevice
{
private:
long m_id;
public:
USBDevice(long id) : m_id(id) {}
long getID() { return m_id; }
void plugAndPlay() {}
};
📜NetworkDevice 클래스
class NetworkDevice
{
private:
long m_id;
public:
class NetworkDevice(long id) : m_id(id) {}
long getID() { return m_id; }
void networking() {}
};
📜USBNetworkDevice 클래스
class USBNetworkDevice : public USBDevice, public NetworkDevice
{
public:
USBNetworkDevice(long usb_id, long net_id)
:USBDevice(usb_id), NetworkDevice(net_id)
{}
};
- 두 부모 생성자를 호출한다.
int main()
{
USBNetworkDevice my_device(3.14, 6.022);
my_device.networking();
my_device.plugAndPlay();
return 0;
}
- my_device.networking();
NetworkDevice
클래스로부터 상속 받은 멤버 함수
- my_device.plugAndPlay();
USBDevice
클래스로부터 상속 받은 멤버 함수
🔔 다중 상속시 생길 수 있는 문제
1. 두 부모에게 중복되는 멤버가 있을 때
- 📜USBDevice 클래스, 📜NetworkDevice 클래스
long getID() { return m_id; }
두 부모 클래스에 getID 함수가 중복되어있어 이 두 클래스를 호출하는 자식클래스 📜USBNetworkDevice 에서 이 함수를 호출시 어떤 부모의 getID를 호출해야할지 애매해 에러가 생긴다.
- 📜USBNetworkDevice클래스
int main() { USBNetworkDevice my_device(3.14, 6.022); my_device.USBDevice::getID(); my_device.NetWorkDevice::getID(); }
부모 이름을 앞에 명시해주어 어떤 부모의 함수인지 명확히 해주자.
2. 다이아몬스 상속
- 다중 상속에서 발생할 수 있는 문제다.
- C 클래스는 A 클래스를 상속받는 B1, B2를 다중상속 받기 때문에 C 클래스에 A로부터 상속받은 부분이 두번 중복되어 상속되는 문제가 생긴다.
- 해결법 : 가상 상속 받기 참고포스트
다중 상속은 이렇게 다이아몬드 상속 문제를 일으킬 수 있으므로 신중히 사용하는 것이 좋다. 이 문제 때문에 Java에선 다중 상속을 지원하지 않는다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글남기기