当超类中的构造函数接收到参数时,它不再是默认构造函数,对吧?例如
class a {
public:
int a;
int b;
a(int c, int d){
cout<<"hello";
};
}
现在,当我尝试创建一个子类时,程序会导致错误,它说“在超类中没有定义默认构造函数”。我怎么解决这个问题?我知道如果我删除了这些参数,一切都会好起来的,但我被告知不要在我的C ++测试中这样做。请帮我搞清楚。
答案 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;
}