наследование operator+
От: Demokratizator  
Дата: 14.10.04 07:03
Оценка:
День добрый! такой вопрос возник!
Есть класс в котором перегружен ooperator+ и возвращает он естественно тип этого класса.
Есть производный от него класс который полностью наследует базовый!
так вот этот производный класс может использовать этот operator+ но проблеиа в том что он возвращает обьект типа базовый класс. и возникает ошибка приведения типа базового к потомку — и это спарведливо!
как этого лучше избежать
либо переопределять приведение типа
либо что-то еще?
Step be Step пока от монитора не ослеп!
Re: наследование operator+
От: LaptevVV Россия  
Дата: 14.10.04 07:18
Оценка:
Здравствуйте, Demokratizator, Вы писали:

D>День добрый! такой вопрос возник!

D>Есть класс в котором перегружен ooperator+ и возвращает он естественно тип этого класса.
D>Есть производный от него класс который полностью наследует базовый!
D>так вот этот производный класс может использовать этот operator+ но проблеиа в том что он возвращает обьект типа базовый класс. и возникает ошибка приведения типа базового к потомку — и это спарведливо!
D>как этого лучше избежать
D>либо переопределять приведение типа
D>либо что-то еще?
Сделать операцию дружественной функцией, во-первых.
А потом переопределить операцию присваивания.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: наследование operator+
От: Евгений Коробко  
Дата: 14.10.04 07:34
Оценка:
class A
{
public:
A(){};
friend A operator + (const A&,const A&)
{
return A();
};
};

class B : public A
{
private:
B(const A&){};
friend B operator + (const B& b1,const B& b2)
{
return operator + (static_cast<const A&>(b1),static_cast<const A&>(b2));
}
};
Posted via RSDN NNTP Server 1.9 gamma
Евгений Коробко
Re[3]: наследование operator+
От: Lorenzo_LAMAS  
Дата: 14.10.04 08:00
Оценка:
Ага, очень хорошо, учитывая, что оператор для объектов базового класса (которы вызван в операторе для производного) ПО ЗНАЧЕНИЮ возвращается объект типа А. Пробуем компилить
Of course, the code must be complete enough to compile and link.
Re[4]: наследование operator+
От: Евгений Коробко  
Дата: 14.10.04 09:06
Оценка:
А для ченр, по-твоему, объявлен конструктор
..
B(const A&){}

?

Он создаёт объект класса B на основе объекта класса А, созданного вызываемым оператором.
Posted via RSDN NNTP Server 1.9 gamma
Евгений Коробко
Re[5]: наследование operator+
От: Lorenzo_LAMAS  
Дата: 14.10.04 09:09
Оценка:
Проглядел
Of course, the code must be complete enough to compile and link.
Re: наследование operator+
От: Кодт Россия  
Дата: 14.10.04 09:43
Оценка:
Здравствуйте, 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; }
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.