18.8 Virtual base classes


https://www.learncpp.com/cpp-tutorial/virtual-base-classes/
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を仮想パブリックデバイスとして継承
詳細は詳細