第二个派生类中的C ++初始化列表

时间:2013-05-09 17:43:53

标签: c++ inheritance constructor initialization-list

我正在尝试编写一个相对较深的类heirarchy,并且我的编译器不断抛出“没有匹配函数来调用[低音类的默认构造函数]”。这是场景:

Class A {
    A(int);//note, no default constructor
}

Class B : public A {
    B(int i, int j) : A(i), someMemberVariable(j) {}
    int someMemberVariable;
}

Class C : public B {
    C(int k, int l) : B(k, l) {}
}

并且编译器在类C的构造函数的行上抛出错误,说“没有用于调用A :: A()的匹配函数”并告诉我使用A :: A(int)。

我知道我没有A类的默认构造函数,当我尝试子类化子类时编译器会变得混乱。但是,我不明白的是为什么。我使用了初始化列表来避免这种情况。如果我只使用2级深度的类,那么它的工作正常,但是第三类给了我错误。我在这里做错了什么?

1 个答案:

答案 0 :(得分:3)

正如人们评论你只需要将构造函数公开,然后你的代码就会出现一些格式问题:

class A 
{
  public:
    A(int a) : blah(a) {}; //note, no default constructor
    int blah;
};

class B : public A 
{
  public:
    B(int i, int j) : A(i), someMemberVariable(j) {}
    int someMemberVariable;
};

class C : public B 
{
  public:
    C(int k, int l) : B(k, l) {}
};

int main( void )
{
  C c(5,4);
  return 0;
}

此代码可以干净地编译并执行您想要的操作。