2015-12-20 3 views
0

Я новичок в C++. Я работаю над наследованием. В моем коде, когда я пытаюсь вызвать функцию-член базового класса из производного класса, я получаю ошибку statement cannot resolve address of overloaded function. Я применил оператор области действия, и функция-член базового класса защищена, так что у производного нет проблемы с доступом к функциям. Что я здесь делаю неправильно? Вот мой код:Ошибка при вызове защищенной функции базового класса

#include <iostream> 
#include <string.h> 

using namespace std; 
class Employee 
{ 
private: 
    char *emp_name; 
    int emp_code; 
    char *designation; 

protected: 
    Employee(char *name ="",int code = 0,char *des = "", int nlength=1, int dlength=1): emp_code(code) 
    { 
     emp_name = new char[nlength+1]; 
     strncpy(emp_name,name,nlength); 

     designation = new char[dlength+1]; 
     strncpy(designation,des,nlength); 
    } 

    ~Employee() 
    { 
     delete[] emp_name; 
     delete[] designation; 
    } 

    char* GetName() 
    { 
     return emp_name; 
    } 

    int GetCode() 
    { 
     return emp_code; 
    } 

    char* GetDes() 
    { 
     return designation; 
    } 
}; 

class Work: public Employee 
{ 
private: 
    int age; 
    int year_exp; 

public: 
    Work(char *name ="", int code = 0, char *des = "", int nlength=1, int dlength=1, int w_age=0, int w_exp=0):Employee(name,code,des,nlength,dlength),age(w_age),year_exp(w_exp) 
    { 
    } 

    void GetName() 
    { 
     Employee::GetName; 
    } 

    void GetCode() 
    { 
     Employee::GetCode; 
    } 

    void GetDes() 
    { 
     Employee::GetDes; 
    } 

    int GetAge() 
    { 
     return age; 
    } 

    int GetExp() 
    { 
     return year_exp; 
    } 

}; 

int main() 
{ 
    using namespace std; 
    Work e1("Kiran",600160,"Implementation Specialist", strlen("Kiran"),strlen("Implementation Specialist"),24,5); 

    cout << "Name: " << e1.GetName() << endl; 
    cout << "Code: " << e1.GetCode() << endl; 
    cout << "Designation: " << e1.GetDes() << endl; 
    cout << "Age: " << e1.GetAge() << endl; 
    cout << "Experience: " << e1.GetExp() << endl; 
} 

Кроме того, я получаю ошибку no-match for operator<<. Я не печатаю какой-либо класс. Я просто называю функцию производного класса здесь.

+0

'Сотрудник :: GetCode' ничего не говорит. 'Employee :: GetCode()' делает. –

+0

'e1.GetName()' не возвращает никакого значения (возвращаемый тип 'Work :: GetName' является' void'), поэтому неясно, что вы пытаетесь напечатать. –

ответ

1

Как уже отмечалось, производный класс Work::GetName равен void, поэтому он не возвращает никакого значения. Вы можете изменить, что:

class Work: public Employee 
{ 
//... 
public: 
//... 
    char *GetName() 
    { 
     return Employee::GetName(); 
    } 

Или, если вы просто хотите использовать базовый класс Employee::GetName() но обнародует его в производном классе, все, что вам нужно сделать, это повторно объявить его как общественности в Work.

class Work: public Employee 
{ 
//... 
public: 
//... 
    using Employee::GetName; // <--- this re-declares the inherited GetName() as public 


[EDIT] Изменен "повторно объявлять" код следовать текущим C++ лучших практиков, спасибо @AlanStokes за комментарий. В частности, «заявление доступа», как один первоначально использовалось

Employee::GetName; // <--- this re-declares the inherited GetName() as public 

устарели, так как C++, 98 в пользу «с помощью деклараций» с тем же эффектом.

using Employee::GetName; // <--- this re-declares the inherited GetName() as public 
+1

Современный синтаксис - это «использование Employee :: GetName;». Версия без 'использования' называется * объявлением доступа * и устарела почти 20 лет. –

0

C++ делает не позволяет ссылаться на членов, просто называя их. Вам нужно будет указать свой адрес, например &Employee::GetDes, или вам нужно будет позвонить им, как Employee::GetDes(). Вы также можете захотеть убедиться, что вы действительно возвращаете результат, но просто вызов члена будет работать, хотя он вряд ли даст желаемый результат.

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