我想使用基类而不是初始化列表为子类定义一个构造函数。 我的意思是为什么我不能在子类构造函数中使用基类构造函数,而超出子类范围。
class base
{
public:
base(int _x);
protected:
int x;
};
base::base(int _x)
{
x = _x;
}
class sub : public base
{
public:
sub(int _x, int _r);
private:
int r;
};
sub::sub(int _x, int _r)
{
base(_x); // here I got syntax error
r = _r;
}
我知道我可以这样使用初始化列表:
sub(int _x, int _r) : base(_x), r(_r) {};
但是我想知道为什么使用上面的第一个代码是错误的,并且出现语法错误 正如我提到的。
答案 0 :(得分:2)
这是错误的:
sub::sub(int _x, int _r)
{
// Too late...
}
一旦您输入sub
构造函数主体,就必须构造您的base
类。
由于您没有在初始化程序列表中指定任何构造函数,因此编译器会尝试调用默认构造函数,但是base
没有任何构造函数。
这就是为什么出现no matching function for call to 'base::base()'
错误的原因。
您可以改为:
sub::sub(int _x, int _r) : base(_x)
{
r = _r;
}
不再需要调用默认构造函数,因此它可以正常工作。
此外,您不应该尝试手动调用构造函数。
此:
base(_x); // here I got syntax error
实际上创建了一个临时base
对象,它不会调用当前的对象构造函数。