使用基类构造函数的子类构造函数的大纲定义

outline definition of sub class constructor using base class constructor

本文关键字:构造函数 定义 子类 基类      更新时间:2023-10-16

我想使用子类的基类但不使用初始值设定项列表为子类定义构造函数。我的意思是为什么我不能在子类构造函数中使用基类构造函数,而是在子类范围之外。

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

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

这是

错误的:

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