C++ Chapter 11.8 : 다중 상속

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 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. 다이아몬스 상속

  • 다중 상속에서 발생할 수 있는 문제다.
    • image
    • C 클래스는 A 클래스를 상속받는 B1, B2를 다중상속 받기 때문에 C 클래스에 A로부터 상속받은 부분이 두번 중복되어 상속되는 문제가 생긴다.
    • 해결법 : 가상 상속 받기 참고포스트

다중 상속은 이렇게 다이아몬드 상속 문제를 일으킬 수 있으므로 신중히 사용하는 것이 좋다. 이 문제 때문에 Java에선 다중 상속을 지원하지 않는다.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기