我不确定为什么会这样 - 希望有人能解释一下!
我有一个名为BaseRequest的基类,其中包含:
protected int cartNumber;
我有一个派生类,它继承了BaseRequest。它有一个公共字段和构造函数如下:
public int currentCartNumber;
public ExtendedBaseRequest(int cartNumber)
{
currentCartNumber = cartNumber;
}
是的,我知道在基类中有一个与受保护字段同名的参数有点傻,但直到现在我才注意到它!
这会编译并运行,但派生类中的public currentCartNumber值未设置,因为它使用基类中的值,初始化时始终为零。
编译器是否应该对此抱怨,因为构造函数签名中的cartNumber声明与基础中的声明具有相同的名称?
期待您的回音。
答案 0 :(得分:7)
这会编译并运行,但派生类中的public currentCartNumber值未设置,因为它使用基类中的值,初始化时始终为零。
该描述与您提供的代码片段不匹配。请提供一个完整的简短程序,我们可以自行编译并运行以重现所谓的行为。
编译器是否应该对此抱怨,因为构造函数签名中的cartNumber声明与基础中的声明具有相同的名称?
不,这完全合法。在同一声明空间中声明两次相同的名称是违法的,但基类和形式参数列表具有不同的声明空间。
我们希望这样做是合法的:
class C
{
int blah;
public C(int blah)
{
this.blah = blah;
}
}
答案 1 :(得分:3)
您对正在发生的事情的分析是不正确的。这里还有别的东西。
您确定没有将0
传递给构造函数吗?
不合格的cartNumber
将始终引用该参数。继承的字段需要使用this
或base
。
在问题中显示的代码中,语句currentCartNumber = cartNumber
会将cartNumber
参数的值分配给currentCartNumber
字段
答案 2 :(得分:-1)
我会说你无法解决这个问题,你可以使用它来强制使用本地成员,但你无法指定你想要使用该参数。
使用类似m_或我的前缀的smth重命名本地受保护成员,或者更改参数名称。
见这里: