C2512のエラー

派生クラスを作ったところ、C2512のエラーが発生。

error C2512: ‘parent’ : クラス、構造体、共用体に既定のコンストラクタがありません。

// 親クラス
class parent
{
    base(int i){}
    virtual ~base(){}
}
// 派生クラス
class child : public parent
{
    child(int i){} // エラー C2512
    ~child(){}
}

例によって、例のごとく、未熟者故、すぐには意味が分からない。
_| ̄|○ごめんなさい
確かに、childクラスには、既定のコンストラクタはないですが、それが何か?

調べていたら、下記のページを発見して、ようやく意味を理解。

http://bakera.jp/ebi/topic/504

この場合のC2512のエラーの意味は、派生クラスのコンストラクタでは、明示しない限り、親クラスのデフォルトコンストラクタ(引数なしのコンストラクタ)が呼ばれるんだけど、それがないということだった。

これは、オブジェクト指向をちゃんと理解していれば、すぐ分かることだろう。それに、エラーの場所こそ、childクラスのコンストラクタになっているけれど、エラーメッセージには、’parent’と書いてある。

下記のように、派生クラスのコンストラクタで明示的に親クラスの引数ありのコンストラクタを指定したら、OKだった。

// 派生クラス
class child : public parent
{
    child(int i) : parent(i) {} // OK
    ~child(){}
}