17.9 Multiple inheritance


https://www.learncpp.com/cpp-tutorial/multiple-inheritance/
これまでの遺産はみな単独相続だった
ただしc++は多重継承もサポートしている
これは、複数のクラスから継承できることを意味します.

Problems with multiple inheritance


一見簡単に見えますが、中傷でプログラムが複雑になりメンテナンスが困難になります
第一に、曖昧性が生じる可能性があります.たとえば、2つの親に同じ関数がある場合.
この場合、コンパイラエラーが発生します.
#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;
}
上のコードを実行すると、2つの親にgetID()があるため、コンパイルエラーが発生します.
しかし、それを迂回する方法があります.function callの明確な指定
int main()
{
    WirelessAdapter c54G { 5442, 181742 };
    std::cout << c54G.USBDevice::getID();

    return 0;
}
前述したように、USBDEvice::エラーを回避するために、任意の関数を明示的に設定できます.
これは簡単に見えますが、等級が大きいほど重くなり、簡単ではありません.
第二に、ダイヤモンド問題

上記のように、ダイヤモンド形状の継承関係に現れる場合
これについては後で詳しく話します

Is multiple inheritance more trouble than it’s worth?


多くのプログラマーは中傷を捨てるべきだと信じている.
しかし、これはまったく使わないという意味ではありません.
iostreamのオブジェクトstd::cin std::coutが多重継承を実現