' P '

whatever I will forget

C++ 継承元クラスに引数を渡す場合

下記のようなコードの場合、
Derivedオブジェクトに渡されたintの値である1000は、
Base(int x)である、"base int overloaded constructor"が最初に実行される。
Derivedクラスにはintを引数としたコンストラクタが無いので、
Baseクラスのvalueは1000の値になるが、
Derivedクラスのdoubled_valueは初期化されない事態となってしまう。

C++ 11からは、usingというコマンドが使えて、
これを使ってBaseクラスを指定すると、そのクラスのコンストラクタを暗黙的に宣言してくれる。

class Base {
private:
  int value;
public:
  Base(): value{0} { cout << "base no-args constructor" << endl; }
  Base(int x): value{x} { cout << "base int overloaded constructor" << endl; }
  ~Base() { cout << "base decstructor" << endl; }
};

class Derived : public Base {
  using Base::Base;
private:
  int doubled_value;
public:
  Derived(): doubled_value(0) { cout << "derived no-args constructor" << endl; }  
};

int main(){
  Derived a {1000};
  return 0;
}

上記問題を解決するのが、下記(まあDerivedクラスにコンストラクタ書けよ、ってツッコミは無視してw)

class Derived : public Base {
private:
  int doubled_value;
public:
  Derived() : Base{}, doubled_value{0} { cout << "derived no-args constructor" << endl; }  
  Derived(int x) : Base{x}, doubled_value{x * 2} { cout << "derived int overloaded constructor" << endl; }  
};

こうすることで、Baseクラスのコンストラクタを明示的に使用する、という宣言になる。
ちゃんとdoubled_valueが2000になったよ、というお話。