2012-01-16 239 views
-1

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

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

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

+0

这是有关:http://stackoverflow.com/questions/5577663/about-base-class-in-derived-class -initialization – 2012-01-16 15:43:10

回答

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; 
} 
+0

我不允许修改编码,我只是为该超类添加了一些额外的子类。 – 2012-01-16 15:50:57

+0

这不涉及修改基类,只涉及派生类(es)。为了完整性,我已经包含了一个基类定义,但是(例如)这里给出的'b'应该与您在问题中定义的'a'一起工作。 – 2012-01-16 15:53:10

+0

我试过了,但visual studio强调整行b():a(1,2){}, – 2012-01-16 15:56:21

2

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

a::a() 
{ 

} 

一旦你为你的类提供任何构造函数,编译器不产生隐含的默认构造函数不带任何参数。所以如果你的代码需要一个没有参数的构造函数,你将不得不自己提供它。

+0

我刚刚尝试过,但它给了我同样的错误+ a :: a(){}中的一个新错误。任何想法? – 2012-01-16 15:49:09

+0

请将您的代码张贴在Question.Unless中显示您所尝试的内容如何获得帮助? – 2012-01-16 15:50:40

+0

我给了一个代码,我不允许修改它。我要求做的是添加两个基于给定的超类的子类,类是这样的:class a { public: \t int x; \t string h; \t a(int y,string d){ \t \t y = 10; \t d =“hello”; \t cout << y << endl << d; \t}; }; – 2012-01-16 15:52:44

3

如果你的基类不是默认 - 构造的,或者如果你不希望使用基类的默认构造函数,然后你只需要告诉派生类中如何构建基子:

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