为什么我必须在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
答案 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";
}
};