为什么方法payment1
会提供与payment2
不同的输出? payment2
具有与方法名称相同的参数名称(我希望我说这是对的吗?)。我的意思是代码this->moneysamename+=moneysamename;
。为什么编译器不能区分2个变量?
这里是完整的代码:
#include <iostream>
using namespace std;
class Person
{
protected:
static int money;
static int moneysamename;
public:
virtual void payment1(float money1) = 0;
virtual void payment2(float moneysamename) = 0;
};
class Worker : public Person
{
public:
virtual void payment1(float moneyanothername)
{
this->money+= moneyanothername;
cout << "Worker: " << money << endl;
};
virtual void payment2(float moneysamename)
{
this->moneysamename+= moneysamename;
cout << "Worker: " << moneysamename << endl;
};
};
void pay1(Person &m, float sum)
{
m.payment1(sum);
}
void pay2(Person &m, float sum)
{
m.payment2(sum);
}
int Person::money = 0;
int Person::moneysamename = 0;
int main()
{
Worker Gaston;
pay1(Gaston, 200);
pay1(Gaston, 300);
pay2(Gaston, 200);
pay2(Gaston, 300);
}
输出:
Worker: 200
Worker: 500
Worker: 200
Worker: 300
答案 0 :(得分:3)
您的问题是您没有在payment2
中打印静态变量,而是打印本地函数变量
cout << "Worker: " << moneysamename << endl;
由于在上面一行中您没有像在
中那样使用this->
this->moneysamename+= moneysamename;
你得到函数local moneysamename
而不是静态成员变量。将输出更改为
cout << "Worker: " << this->moneysamename << endl;
你会得到相同的输出。
你在payment1
中没有得到这个的原因是函数参数的名称与静态变量的名称不同。你做过这个功能
virtual void payment1(float money)
{
this->money+= money;
cout << "Worker: " << money << endl;
};
你会得到相同的结果。
答案 1 :(得分:2)
virtual void payment2(float moneysamename)
{
this->moneysamename+= moneysamename;
cout << "Worker: " << moneysamename << endl;
};
这里面payment2
,moneysamename
将始终通过C ++作用域规则引用函数的第一个参数(最接近的定义)。因此,将始终打印函数的参数,而不是具有相同名称的父类的静态受保护变量。
要打印本地父变量,您必须通过cout << "Worker: " << this->moneysamename << endl;