В моем приложении Clini c я использую шаблон проектирования DAO для доступа к БД. Я создал шаблон интерфейса DAO
template <class T>
class DAO{
public:
virtual std::unique_ptr<T> get(int id) = 0;
virtual std::list<T> getAll() = 0;
virtual bool add(T obj) = 0;
virtual bool update(T ob1, T obj2) = 0;
virtual bool remove(int id) = 0;
};
Кроме того, у меня есть эта иерархия людей, связанных с клини c - Базовый класс Person
, производные классы Patient
и Doctor
.
Я создал реализацию интерфейса DAO для Person.
class PersonDAO : virtual public DAO <Person>, public SQLManager
{
public:
virtual std::unique_ptr<Person> get(int id);
virtual std::list<Person> getAll();
bool add(Person obj);
bool update(Person oldData, Person newData);
bool remove(int id);
};
В моем приложении я не работаю с Person
объектами - я использую только Patient
и Doctor
, поэтому я бы Мне нравится использовать методы из PersonDAO
, например, при разборе объектов в / из объектов, поэтому я не дублирую код. В этом случае я реализовал этот класс PatientDAO
class PatientDAO : virtual public DAO<Patient>, public PersonDAO
{
public:
std::unique_ptr<Patient> get(int id);
std::list<Patient> getAll();
bool add(Patient obj);
bool update(Patient oldData, Patient newData);
bool remove(int id);
};
В результате я получил эти две ошибки
'PatientDAO :: get': тип возвращаемой переопределенной виртуальной функции отличается и не ковариантный из «PersonDAO :: get»
«PatientDAO :: getAll»: тип возвращаемой переопределенной виртуальной функции отличается и не является ковариантным из «PersonDAO :: getAll»
, оба показывают до двух раз. Я ясно вижу, в чем проблема, но я не могу найти способ обойти это.