Я использую базовый класс для определения интерфейса для любого объекта с определенными доступными операциями. Когда я на самом деле реализую производный класс, я получаю ошибки «недопустимый ковариантный тип возврата» во всех моих унарных операторах (но не в моих бинарных операторах). Вот соответствующий код:
class elem {
public:
virtual elem operator+(const elem &other) const = delete;
virtual elem operator-() const = delete;
virtual elem operator*(const elem &other) const = delete;
};
class specialElem : public elem {
public:
virtual specialElem operator+(const specialElem &other) const {
//...
}
virtual specialElem operator-() const {
//...
}
virtual specialElem operator*(const specialElem &other) const {
//...
}
};
Я посмотрел это сообщение об ошибке, и ответ был «использование производного класса в качестве возвращаемых типов (вместо базового класса) работает только при возврате по ссылке / указателю, а не по значению». Но сейчас я не понимаю; если это правда, почему бинарные операторы работают, а не унарные?
Бонус: каков "нормальный способ C ++" реализации интерфейса, когда мы хотим вернуть по значению?