通过继承访问受保护的成员

Accessing Protected members by inheritance

本文关键字:成员 受保护 访问 继承      更新时间:2023-10-16

在这一段代码中,我试图从派生类访问基类的受保护成员。但是在派生类中,它说"无法访问受保护的成员"

#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()中的empman访问Name_userPerHr

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_userPerHr的表达式位于函数main中,该函数对EmployeeManager的任何私有或受保护成员没有任何权限。

您可以从

派生类内部访问它,但不能从main访问它(或从除Employee及其派生类之外的任何其他位置)。

Manager 内部的方法中,你将能够访问Employeeprotected成员,但无法访问Employeeprivate成员。在 EmployeeManager 之外(如在 main 中),您只能访问public成员。

cout << "Name inherited" << man.Name_user << endl;
cout << "Per hr pay is " << man.PerHr << endl;

在main中无法访问受保护的成员,只有当他们是公共的时才能这样做。