下記のようなコードの場合、
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になったよ、というお話。