Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2008, 21:50   #1
paramon
 
Регистрация: 14.06.2008
Сообщений: 3
По умолчанию Перегрузка == при наследовании

Нид хелп. Экзамен через неделю, а мне ну ни как не разобраться.

Есть клас A(), от него наследуется класс B()
В А только виртуальные функции.
Мне нужно перегрузить оператор ==

Соответственно вопросы:
1. Что нужно писать в классе А()
2. Как перегрузить оператор == виртуально

Вот что я пытаюсь делать

А()
Код:

a.h
...
	virtual bool operator == (const A &ref);
	friend bool operator == (const A &ref,const A &ref2);	

a.cpp
...
bool shape::operator == (const A &ref)
{
return false;
}

bool operator == (const A &ref,const A &ref2)
{
	return false;
}


//Класс B()

b.h
class b: public a 
{
...
	bool operator == (const b &ref);
	friend bool operator == (const b &ref,const b &ref2);	
}

b.cpp
...

bool circle::operator == (const b &ref)
{

	return ((var == ref.var ));
}

bool operator == (const b &ref,const b &ref2)
{
	if(operator==(static_cast<const a&>(ref), static_cast<const a&>(ref2)) == false)
	{
		return false;
	}
	else
	{
		return (ref.var == ref2.var );
	}
}

Соответственно это не работает
Выдает ошибку:
error C2665: 'operator ==' : none of the 4 overloads could convert all the argument types

Помогите плз, уж не знаю что делать !

Спасибо.
paramon вне форума Ответить с цитированием
Старый 14.06.2008, 22:34   #2
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Возможно, я не до конца понял, что нужно получить, но, думаю, если что пример даст верное направление.

Код:
#include <iostream>

class A {
public:
  virtual bool operator==(const A&)  // определение виртуальной функции
  {
    std::cout << "A from class A" << std::endl;
    return false;
  }
};

class B: public A {
public:
  bool operator==(const A&)          // переопределение виртуальной функции
  {
    std::cout << "A from class B" << std::endl;
    return false;
  }

  bool operator==(const B&)          // перегрузка
  {
    std::cout << "B from class B" << std::endl;
    return false;
  }
};

int main() 
{
  A a, b;
  B i, j;
  std::cout << "a == b: "; a == b;
  std::cout << "i == j: "; i == j;
  std::cout << "i == b: "; i == b;
  std::cout << "a == j: "; a == j;
  return 0;
}
Если это не то что надо, то разберитесь с тем, что же такое виртуальные функции и для чего они нужны, а также что есть перегрузка и переопределение, а потом переформулировать задание с вопросами.

Последний раз редактировалось filosof_x86; 15.06.2008 в 00:20.
filosof_x86 вне форума Ответить с цитированием
Старый 14.06.2008, 23:30   #3
paramon
 
Регистрация: 14.06.2008
Сообщений: 3
По умолчанию

Не совсем так.

Ваш пример с двумя раздельными классами. С обычной перегрузкой все понятно,.

Мне нужна перегрузка при наследовании, когда в базовом классе функции виртуальные.
Плюс в вашем примере фигурирует перегрузка == только с помощью класса когда мы правый параметр сравниваем с элементом класса.

А мне нужно еще и перегрузка с помощью функции, когда мы сравниваем и левый и правый параметры. Ну т.е. если мы сравниваем в классе два объекта не принадлежащих этому классу например если мы с копиями работаем.

Вот наверное основной смысл вопроса, как сделать перегрузку при наследовании методом функции.
paramon вне форума Ответить с цитированием
Старый 15.06.2008, 00:23   #4
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Цитата:
Сообщение от paramon Посмотреть сообщение
Ваш пример с двумя раздельными классами. С обычной перегрузкой все понятно,.

Мне нужна перегрузка при наследовании, когда в базовом классе функции виртуальные.
Мда... чет я пропустил я этот момент у себя. Исправления в код внес.
filosof_x86 вне форума Ответить с цитированием
Старый 15.06.2008, 02:45   #5
paramon
 
Регистрация: 14.06.2008
Сообщений: 3
По умолчанию

Вроде чуть чуть понятнее

У вас перегрузка методом класса ! А если методом функции делать нужно ?

Код:
class A {
public:

 bool operator == (const A &ref,const A &ref2)  //тут должно быть friend
 { 
     return false; 
 }
Тут virtual уже не поставить !?
paramon вне форума Ответить с цитированием
Старый 17.06.2008, 00:17   #6
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Цитата:
Сообщение от paramon Посмотреть сообщение
Тут virtual уже не поставить !?
Да, модификатор virtual можно применить только к функциям-членам класса. Модификатор friend дает право в доступе к скрытым членам класса внешним функциям, которые уже никак не являются функциями-членами этого класса.
filosof_x86 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перегрузка + softrix Общие вопросы C/C++ 2 21.06.2008 22:27
Перегрузка функций... bondik Общие вопросы C/C++ 12 28.04.2008 01:07
Перегрузка ввода MaTBeu Общие вопросы C/C++ 9 23.12.2007 16:22
Перегрузка ++ Dark_Maks Общие вопросы C/C++ 2 18.12.2007 09:27