通过继承访问受保护的成员
Accessing Protected members by inheritance
在这一段代码中,我试图从派生类访问基类的受保护成员。但是在派生类中,它说"无法访问受保护的成员"
#include<iostream>
using namespace std;
class Employee
{
public:
Employee(char Name, int perHrPay) { Name_user=Name, PerHr=perHrPay;};
Employee() {}
~Employee() {}
char getName() const;
float getPayPerHr() const;
float paymentIs() const ;
protected:
char Name_user;
float PerHr;
};
class Manager : public Employee
{
public:
Manager(){}
~Manager(){}
float paymentIs() const ;
};
char Employee::getName() const { return Name_user; }
float Employee::getPayPerHr() const { return PerHr; }
float Employee::paymentIs() const { return PerHr*3; }
int main()
{
Employee emp('S',94);
Manager man;
cout << " The name is " << emp.getName() << endl;
cout << "The per hr pay is " << emp.getPayPerHr() << endl;
cout << "The payment is " << emp.paymentIs() << endl;
cout << "Name inherited" << man.Name_user << endl;
cout << "Per hr pay is " << man.PerHr << endl;
return 1;
}
在此代码中,人无法访问类雇员中的受保护成员Name_user。我不明白为什么继承的类无法访问它。请帮助
的类能够访问受保护的成员,但是在您的代码中,您尝试从函数main
而不是从派生类方法访问它...
不得从main()
中的emp
或man
访问Name_user
或PerHr
。
Manager
的实施允许访问受保护的成员Employee
。并且允许用户或Manager
使用Employee
的公共接口,因为它公开继承自Employee
。
因此,从 man
开始,使用访问器方法,就像对 emp
所做的那样。
cout << "Name inherited" << man.getName() << endl;
cout << "Per hr pay is " << man.getPayPerHr() << endl;
在此代码中,
man
无法访问类中的受保护成员Name_user
Employee
您需要明确"X 访问 Y"在C++术语中的含义。
上面,X
必须是一个函数;数据成员和局部变量不能"访问"任何东西,因为它们是被动的。
在你的例子中,说man
"访问"man.Name_user
中的任何内容是不正确的,因为man
不是一个函数。
在这种情况下,函数是main
,它尝试访问Manager
类中的Name_user
。它是受保护的成员,因此main
等独立函数无法访问它。
为了解决这个问题,使公共成员在Manager
中起作用,并从中访问Name_user
:
class Manager : public Employee
{
public:
Manager(){}
~Manager(){}
float paymentIs() const ;
char name_user() const { return Name_user; }
};
现在,main
可以通过调用函数来获取对Name_user
man.name_user()
读取访问权限。
protected
表示可以从属于派生类的函数访问成员,如Manager::paymentIs
(有一些其他限制)。
在您的代码中,尝试使用成员Name_user
和PerHr
的表达式位于函数main
中,该函数对Employee
或Manager
的任何私有或受保护成员没有任何权限。
派生类内部访问它,但不能从main
访问它(或从除Employee
及其派生类之外的任何其他位置)。
在 Manager
内部的方法中,你将能够访问Employee
的protected
成员,但无法访问Employee
的private
成员。在 Employee
和 Manager
之外(如在 main
中),您只能访问public
成员。
cout << "Name inherited" << man.Name_user << endl;
cout << "Per hr pay is " << man.PerHr << endl;
在main中无法访问受保护的成员,只有当他们是公共的时才能这样做。
- C++:无法访问声明的受保护成员
- 继承和友元函数,从基类访问受保护的成员
- 为什么派生类的好友不能使用受保护的成员?
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 从模板化父类中的派生内部类访问受保护的成员变量
- 在使用受保护和继承时无法访问在类中声明的私有成员
- 同一模板类但模板类型的受保护成员
- 派生类无法访问基类的受保护成员
- 继承期间受保护成员的皮条
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 是否可以基于私有/受保护成员分配类枚举?
- 依赖模板基础的受保护成员
- 将派生类构造函数参数传递给受保护的成员
- 无法从派生类型的作用域访问另一个实例的受保护成员
- 为什么我无法使用受保护/私有继承访问派生实例中基类的受保护成员?
- 将对象强制转换为派生类以访问父类的受保护成员
- 使从一个基类派生的类能够使用继承的受保护成员
- 无法访问派生类函数内的基类的受保护数据成员
- 派生类如何使用基类的受保护成员