#include <iostream>
using namespace std;

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

class Scanner : virtual public PoweredDevice
{
public:
    Scanner(int scanner, int power)
        : PoweredDevice(power)
    {
    	cout << "Scanner: " << scanner << "\n";        
    }
};

class Printer : virtual public PoweredDevice
{
public:
    Printer(int printer, int power)
        : PoweredDevice(power)
    {
    	cout << "Printer: " << printer << "\n";        
    }
};

class Copier : public Scanner, public Printer
{
public:
    Copier(int scanner, int printer, int power)
        : Scanner(scanner, power), Printer(printer, power),
    	PoweredDevice(power) // virtual 붙일 시 에러가 뜨는데, 이렇게 부모 클래스의 생성자를 별도로 만들어주면 된다.
    {}
};

int main()
{
    Copier cop(1, 2, 3);
    
    cout << &cop.Scanner::PoweredDevice::m_i << "\n"; 
    cout << &cop.Printer::PoweredDevice::m_i << "\n"; // virtual 없을 시 두 m_i의 주소가 다르다. 
    												  // virtual 있을 시 PoweredDevice 호출이 1번, 그리고 m_i의 주소가 같다.
    												  // 그러니까, PoweredDevice가 하나란 얘기.
    
    return 0;
}