gpt4 book ai didi

c++ - 使用基类构造函数概述子类构造函数的定义

转载 作者:搜寻专家 更新时间:2023-10-31 02:02:50 24 4
gpt4 key购买 nike

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

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

关于c++ - 使用基类构造函数概述子类构造函数的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56555184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com