为什么要在子派生类中构建虚拟基础?

时间:2016-12-13 12:45:38

标签: c++

为什么我必须在SuperCopier的构造函数中调用PoweredDevice?当直接创建Copier对象时,Copier的构造函数已经初始化。

是否有任何简单的方法来封装复印机? (只是使用它的构造函数而不关心它的基础。)

以下代码来自http://www.learncpp.com/cpp-tutorial/128-virtual-base-classes/,几乎没有任何修改。

#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)

    {
    }
};

class SuperCopier: public Copier
{
public:
    SuperCopier(int scanner, int printer, int power)
        :   PoweredDevice(power),//This is the line I want to get rid of
                Copier(scanner, printer, power)
    {
        std::cout<<"Super copier constructed\n";
    }
};

int main()
{
     Copier copier(1,2,3);
    SuperCopier superCopier(4, 5, 6);
}

输出:

PoweredDevice: 3
Scanner: 1
Printer: 2
PoweredDevice: 6
Scanner: 4
Printer: 5
Super copier constructed

1 个答案:

答案 0 :(得分:1)

使用合成,你可能会

class PoweredDevice
{
public:
    explicit PoweredDevice(int power)
    {
        std::cout << "PoweredDevice: " << power << '\n';
    }
};

class Scanner
{
public:
    Scanner(PoweredDevice& powerDevice, int scanner)
        : poweredDevice(powerDevice)
    {
        std::cout << "Scanner: " << scanner << '\n';
    }
private:
    PoweredDevice poweredDevice
};

class Printer
{
public:
    Printer(PoweredDevice& powerDevice, int printer)
        : poweredDevice(powerDevice)
    {
        std::cout << "Printer: " << printer << '\n';
    }
private:
    PoweredDevice poweredDevice
};

class Copier: public PoweredDevice, public Scanner, public Printer
{
public:
    Copier(int scanner, int printer, int power)
        : PoweredDevice(power),
          Scanner(*this, scanner),
          Printer(*this, printer)
    {
    }
};

class SuperCopier: public Copier
{
public:
    SuperCopier(int scanner, int printer, int power)
        : Copier(scanner, printer, power)
    {
        std::cout<<"Super copier constructed\n";
    }
};