#c #inheritance #base-class
#c #наследование #базовый класс
Вопрос:
Я использую наследование для своего кода. ChangeRequest — мой базовый класс. Код выглядит следующим образом.
ChangeRequest.h
#include <iostream>
#include <string>
using namespace std;
class ChangeRequest
{
int swapDay;
int newDay;
public:
void setSwapDay(int newDay);
int getSwapDay();
void setNewDay(int newDay);
int getNewDay();
};
ChangeRequest.cpp
#include "ChangeDutyRequest.h"
void ChangeRequest::setSwapDay(int newDay)
{
swapDay = newDay;
}
int ChangeRequest::getSwapDay()
{
return swapDay;
}
void ChangeRequest::setNewDay(int day)
{
newDay = day;
}
int ChangeRequest::getNewDay()
{
return newDay;
}
Приведенный ниже код предназначен для производного класса. SwapDuty
SwapDuty.h
#include <iostream>
#include <string>
#include "ChangeRequest.h"
using namespace std;
class SwapDuty: public ChangeRequest
{
string requester;
public:
void setRequester(string member);
string getRequester();
};
SwapDuty.cpp
#include "SwapDuty.h"
void SwapDuty::setRequester(string member)
{
requester = member;
}
string SwapDuty::getRequester()
{
return requester;
}
когда я компилирую и получаю доступ к атрибуту requester с помощью getRequester(). Я получаю следующую ошибку.
'class ChangeRequest' has no member named 'getRequester'
Вот как я использовал свой код
Может кто-нибудь, пожалуйста, скажите мне, что я делаю не так? Заранее спасибо
SwapDuty newSwapDutyRequest;
for(int i = 0; i < tempList.size(); i )
{
if(tempList[i].getPersonToPerform().getName() == loginMember)
{
newSwapDutyRequest.setRequester(loginMember);
newSwapDutyRequest.setSwapDay(swapDay);
newSwapDutyRequest.setNewDutyDay(daySwapWith);
break;
}
}
changeList.push_back(newSwapDutyRequest);
cout << changeList[1].getRequester() << endl;
Ответ №1:
Что такое тип списка изменений?
Хотя вы создали объект производного класса, я подозреваю, что вы помещаете его в контейнер базового класса. Возможно, вы также получаете несколько предупреждений перед этой ошибкой из-за того, что вы помещаете производный объект в контейнер типа base.
Если вы хотите создать контейнер базового класса и вставить объекты производного класса, вам нужно работать с указателями на объекты, а не с самими объектами.
Комментарии:
1. объявить чисто виртуальную функцию
getRequester
вChangeRequest
классе
Ответ №2:
Где ваш класс ChangeDutyRequest
? Вы этого не показываете. Может быть, вы забыли наследовать его из правильной базы или вызвать его неправильно?
Показать более полный пример кода
Комментарии:
1. извините, ChangeDutyRequest — это ChangeRequest, я неправильно ввел код.
2. Но
ChangeRequest
не имеетgetRequester
метода. Наследование сSwapDuty
помощью не добавляет метод к базовому классу, только к дочернему классу — вы это понимаете?3. Объект, который я создаю, принадлежит классу SwapDuty, и я прошу получить запрос от него, и он выдает мне эту ошибку. Но SwapDuty имеет атрибут requester’а.
4. @Peter: но на ошибку жалуются
ChangeReqest
, поэтому вы делаете это неправильно. Можете ли вы показать код, который вы используете для создания объекта и доступа к методу?5. @zaharpopov: это не ответ, а комментарий к вопросу, и он должен быть размещен соответствующим образом