C ++,默认构造函数

时间:2012-01-16 15:40:02

标签: c++

当超类中的构造函数接收到参数时,它不再是默认构造函数,对吧?例如

class a {
    public:
      int a;
      int b;
      a(int c, int d){
        cout<<"hello";
      };
} 

现在,当我尝试创建一个子类时,程序会导致错误,它说“在超类中没有定义默认构造函数”。我怎么解决这个问题?我知道如果我删除了这些参数,一切都会好起来的,但我被告知不要在我的C ++测试中这样做。请帮我搞清楚。

3 个答案:

答案 0 :(得分:3)

如果您的基类不是默认构造的,或者如果您不希望使用基类的默认构造函数,那么您只需< em>告诉派生类如何构造基础子对象:

struct b : a
{
    b(int n) : a(n, 2*n) { }
    //         ^^^^^^^^^ <--  base class initializer, calls desired constructor
};

答案 1 :(得分:2)

你必须提供一个不需要参数的构造函数。

a::a()
{

}

一旦为类提供了任何构造函数,编译器就不会生成不带参数的隐式默认构造函数。因此,如果您的代码需要一个无参数构造函数,那么您必须自己提供它。

答案 2 :(得分:2)

您通常使用初始化列表处理此问题:

#include <iostream>

class a { 
public:
    a(int c, int d) { std::cout << c << " " << d << "\n"; }
};

class b : public a { 
public:
    b() : a(1, 2) {}
};

int main() { 
    b x;
    return 0;
}