matthew as a q.

競技プログラミングメイン

c++の親クラスへのコンストラクタ引数受け渡し

継承関係にある以下のような2つのクラスがあるとしよう。

//定義
class IHoge {
    IHoge(const double a);
};

class Hoge {
    Hoge(const double b);
}

//実装
IHoge::IHoge(const double a)
{
}

Hoge::Hoge(const double b)
{
}

このコードはエラーとなる。

error: constructor for 'Hoge' must explicitly initialize the base class
      'IHoge' which does not have a default constructor

なぜエラーとなるのかを考えるためには継承関係の子クラスが生成されるときの仕様を知る必要がある。

まず前提として、子クラスを生成するときには、「子クラスのコンストラクタ→親クラスのコンストラクタ」という順序で親クラスのコンストラクタも呼ばれる。

そのとき、今回のように子クラスHogeコンストラクタが引数aをとって、その親クラスIHogeのコンストラクタも引数bをとるような場合、子クラスを生成したときには、親クラスIHogeのコンストラクタの引数として暗黙的にbが渡されることはない。そこで明示的に渡してやる必要がある。

//definition
class IHoge {
public:
    IHoge(const double a);

};

class Hoge : public IHoge {
public:
    Hoge(const double b);
};

//implementation
IHoge::IHoge(const double a)
{
}

Hoge::Hoge(const double b)
:IHoge(b)
{
}


int main()
{
    Hoge h(1.0);
    return 0;
}

独習C++にも書いてある話。