使用基类构造函数的子类构造函数的轮廓定义

时间:2019-06-12 05:26:46

标签: c++

我想使用基类而不是初始化列表为子类定义一个构造函数。 我的意思是为什么我不能在子类构造函数中使用基类构造函数,而超出子类范围。

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) {}; 

但是我想知道为什么使用上面的第一个代码是错误的,并且出现语法错误 正如我提到的。

1 个答案:

答案 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对象,它不会调用当前的对象构造函数。

相关问题