オーバーロードされたコンストラクタと継承

http://www.geocities.jp/ky_webid/cpp/language/011.html

また更にオーバーロード関係でややこしい仕様があります。

それはコンストラクタです。

コンストラクタは継承順に個々のコンストラクタが自動的に呼ばれるため、引数の個数が違うとどうやって次のコンストラクタに渡す引数を決定すれば良いのか判断がつきません。

そこで次のコンストラクタに対する引数を指定する構文が登場します。

#include <iostream>

class CBase {
public:
    CBase(int);
};

class CSub : public CBase {
public:
    CSub();
    CSub(int);
};

CBase::CBase(int num) {
    std::cout << "CBase: " << num << std::endl;
}

CSub::CSub(int num) : CBase(num) {
    std::cout << "CSub: " << num << std::endl;
}

CSub::CSub() : CBase(0) {
    std::cout << "CSub: " << 99 << std::endl;
}

int main () {
    CSub obj;
    return 0;
}
$ main
CBase: 0
CSub: 99

と、書いていて発覚したのですが、そもそも引数ありのコンストラクタを定義したら問答無用で次のコンストラクタに渡す引数を指定しないといけないみたいですね。なるほど。このあたりはまた後の章で説明があるらしいのでそこでちゃんと確認したいと思います。