17.9 Multiple inheritance

7146 ๋‹จ์–ด c++_studyc++_study

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๋กœ ๊ตฌํ˜„๋˜์—ˆ๋‹ค

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ