2015-04-29 3 views
-2

В этом фрагменте кода я пытаюсь получить доступ к защищенным членам базового класса из производного класса. Но в производном классе он говорит, что «не удается получить доступ к защищенному члену»Доступ к Защищенным членам по наследованию

#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 в классе Employee. Я не понимаю, почему унаследованный класс не может получить к нему доступ. Пожалуйста, помогите

+0

Сделать деструктор работника 'virtual', а также' float paymentIs() ' – AndyG

+1

Защищенные члены недоступны из внешней области. Также как частный. – LogicStuff

+0

'main()' должен возвращать 0 после успешного завершения. Вы можете просто оставить его для C++ 11 (и далее). – jxh

ответ

4

Наследуются класс может получить доступ к защищенным членам, но в своем коде вы пытаетесь получить к нему доступ из main функции, а не из производных методов класса ...

+1

Вкратце: добавьте методы доступа. – tadman

0

Вы можете получить доступ к нему изнутри производному класс, но не от main (или из любого другого места, кроме Employee и его производного класса).

В методе внутри Manager, вы сможете получить доступ к protected членов из Employee, но не будет иметь возможность доступа к private членов из Employee. Вне Employee и Manager (как в main), вы можете получить только public пользователей.

1

Вы не можете получить доступ к Name_user или PerHr либо из emp или man в main().

Реализация Manager разрешена для доступа к защищенным членам от Employee. Пользователям или Manager разрешено использовать общедоступные интерфейсы Employee, так как он публично наследуется от Employee.

Итак, от man, используйте методы доступа так же, как и для emp.

cout << "Name inherited" << man.getName() << endl; 
    cout << "Per hr pay is " << man.getPayPerHr() << endl; 
1

В этом коде man не может получить доступ к защищенному члену Name_user в классе Employee

Вы должны получить ясность о том, что «X доступ к Y» означает, что с точки зрения C++.

Выше, X должно быть функция; члены данных и локальные переменные не могут «получить доступ» к чему-либо, потому что они пассивны.

В вашем примере неверно утверждать, что man «обращается» к чему-либо в man.Name_user, потому что man не является функцией.

Функция в этом случае - main, и она пытается получить доступ к Name_user в классе Manager. Это защищенный член, поэтому автономные функции, такие как 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() функцию.

1

protected означает, что к элементу можно получить доступ к функции, принадлежащей производному классу, например Manager::paymentIs (с некоторыми другими ограничениями).

В коде выражения пытаются использовать элементы Name_user и PerHr в функции main, которая не имеет права на любые частные или защищенные члены Employee или Manager.

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

Вы не можете получить доступ к защищенным членам в главном, вы можете делать это только в том случае, если они являются общедоступными.

Смежные вопросы