День добрый! такой вопрос возник!
Есть класс в котором перегружен ooperator+ и возвращает он естественно тип этого класса.
Есть производный от него класс который полностью наследует базовый!
так вот этот производный класс может использовать этот operator+ но проблеиа в том что он возвращает обьект типа базовый класс. и возникает ошибка приведения типа базового к потомку — и это спарведливо!
как этого лучше избежать
либо переопределять приведение типа
либо что-то еще?
Здравствуйте, Demokratizator, Вы писали:
D>День добрый! такой вопрос возник! D>Есть класс в котором перегружен ooperator+ и возвращает он естественно тип этого класса. D>Есть производный от него класс который полностью наследует базовый! D>так вот этот производный класс может использовать этот operator+ но проблеиа в том что он возвращает обьект типа базовый класс. и возникает ошибка приведения типа базового к потомку — и это спарведливо! D>как этого лучше избежать D>либо переопределять приведение типа D>либо что-то еще?
Сделать операцию дружественной функцией, во-первых.
А потом переопределить операцию присваивания.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Ага, очень хорошо, учитывая, что оператор для объектов базового класса (которы вызван в операторе для производного) ПО ЗНАЧЕНИЮ возвращается объект типа А. Пробуем компилить
Of course, the code must be complete enough to compile and link.
Здравствуйте, Demokratizator, Вы писали:
D>Есть класс в котором перегружен ooperator+ и возвращает он естественно тип этого класса. D>Есть производный от него класс который полностью наследует базовый! D>так вот этот производный класс может использовать этот operator+ но проблеиа в том что он возвращает обьект типа базовый класс. и возникает ошибка приведения типа базового к потомку — и это спарведливо! D>как этого лучше избежать D>либо переопределять приведение типа D>либо что-то еще?
1) перегрузить оператор ещё раз
class A
{
...
A operator+ (A rhs) const { ... }
...
};
class B : public A
{
...
B operator+ (B rhs) const { A sum = A::operator+(rhs); ... }
...
};
2) выразить + через += и внешний оператор
class A
{
...
A& operator+= (A rhs) { ... return *this; }
...
};
A operator+(A /*by value*/ lhs, A rhs) { lhs += rhs; return lhs; }
class B : public A
{
...
B& operator+= (A rhs) { A::operator+=(rhs); .../*если надо*/... return *this; }
B& operator+= (B rhs) { A::operator+=(rhs/*автоматический up-cast*/); .../*если надо*/... return *this; }
};
template<class AB>
B operator+(B /*by value*/ lhs, AB rhs) { lhs+=rhs; return lhs; }