17.9 Multiple inheritance
https://www.learncpp.com/cpp-tutorial/multiple-inheritance/
これまでの遺産はみな単独相続だった
ただしc++は多重継承もサポートしている
これは、複数のクラスから継承できることを意味します.
一見簡単に見えますが、中傷でプログラムが複雑になりメンテナンスが困難になります
第一に、曖昧性が生じる可能性があります.たとえば、2つの親に同じ関数がある場合.
この場合、コンパイラエラーが発生します.
しかし、それを迂回する方法があります.function callの明確な指定
これは簡単に見えますが、等級が大きいほど重くなり、簡単ではありません.
第二に、ダイヤモンド問題
上記のように、ダイヤモンド形状の継承関係に現れる場合
これについては後で詳しく話します
多くのプログラマーは中傷を捨てるべきだと信じている.
しかし、これはまったく使わないという意味ではありません.
iostreamのオブジェクトstd::cin std::coutが多重継承を実現
これまでの遺産はみな単独相続だった
ただし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が多重継承を実現
Reference
この問題について(17.9 Multiple inheritance), 我々は、より多くの情報をここで見つけました https://velog.io/@ikmy0ung/17.9-Multiple-inheritanceテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol