18.8 Virtual base classes
https://www.learncpp.com/cpp-tutorial/virtual-base-classes/
17.9の多重継承ではダイヤモンド問題について述べた.
このセクションでは、引き続き議論します.
私たちは上の関係を考えていますが.
copier class objectを作成したら
プログラムは上のように認識されます.
PoweredDeviceが2回生成されます
この問題を解決するためにvirtualキーワードを使用します.
virtualbaseclassを設定します
PrinterとScannerはPoweredDeviceを仮想パブリックデバイスとして継承
詳細は詳細
17.9の多重継承ではダイヤモンド問題について述べた.
このセクションでは、引き続き議論します.
私たちは上の関係を考えていますが.
copier class objectを作成したら
プログラムは上のように認識されます.
PoweredDeviceが2回生成されます
Virtual base classes
この問題を解決するためにvirtualキーワードを使用します.
virtualbaseclassを設定します
#include <iostream>
class PoweredDevice
{
public:
PoweredDevice(int power)
{
std::cout << "PoweredDevice: " << power << '\n';
}
};
class Scanner: virtual public PoweredDevice // note: PoweredDevice is now a virtual base class
{
public:
Scanner(int scanner, int power)
: PoweredDevice{ power } // this line is required to create Scanner objects, but ignored in this case
{
std::cout << "Scanner: " << scanner << '\n';
}
};
class Printer: virtual public PoweredDevice // note: PoweredDevice is now a virtual base class
{
public:
Printer(int printer, int power)
: PoweredDevice{ power } // this line is required to create Printer objects, but ignored in this case
{
std::cout << "Printer: " << printer << '\n';
}
};
class Copier: public Scanner, public Printer
{
public:
Copier(int scanner, int printer, int power)
: PoweredDevice{ power }, // PoweredDevice is constructed here
Scanner{ scanner, power }, Printer{ printer, power }
{
}
};
上記の場合、PoweredDeviceのコンストラクション関数は1回のみ実行されますPrinterとScannerはPoweredDeviceを仮想パブリックデバイスとして継承
詳細は詳細
Reference
この問題について(18.8 Virtual base classes), 我々は、より多くの情報をここで見つけました https://velog.io/@ikmy0ung/18.8-Virtual-base-classesテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol