2016-12-13 12 views
0

スーパーコンピュータのコンストラクタで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

を行う可能性がありますなぜあなたはその行を取り除くためにしたいですか? – user2393256

+0

私は複雑なクラス階層を残したくありません。開発者は、新しいクラスをCopierから継承します。もちろん、私のクラスはより詳細です... – ataman

+1

継承の代わりにコンポジションを使用するかもしれません。 – Jarod42

答えて

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"; 
    } 
}; 
関連する問題