Форум программистов, компьютерный форум CyberForum.ru

Сравнение при наследовании - C++

Восстановить пароль Регистрация
 
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.01.2014, 09:21     Сравнение при наследовании #1
Есть базовый класс, пусть его зовут А, а у него есть 4 потомка. Пусть их зовут: B, C, D и E. Базовый класса абстрактный,в нём есть виртуальные операторы == и !=, декларированные, как не имеющие реализаций (
C++
1
virtual operator == (A &a)=0;
). Должен ли я в каждом потомке перегружать оба оператора на каждый возможный фактический класс правого операнда? Как вообще правильно декларировать операторы сравнения в потомках абстрактного класса?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2014, 09:21     Сравнение при наследовании
Посмотрите здесь:

C++ Ошибка при наследовании
C++ Ошибка при наследовании
C++ Ошибка при наследовании
Конструкторы при наследовании C++
С++ течет при наследовании C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
07.01.2014, 11:00     Сравнение при наследовании #2
в потомках обязательно перегружать только чистовиртуальные. иначе потомки будут абстрактными.
но этого врятли достаточно для решения вашей задачи.
а задача похоже сведется к реализации двойной диспетчеризации (оно же мультиметоды):
http://alenacpp.blogspot.ru/2007/05/blog-post.html

вот в этой книге в главе 31 неплохо про эти дела написано:
http://www.rsdn.ru/res/book/cpp/most_effective_cpp.xml
Наиболее эффективное использование C++. 35 новых рекомендаций по улучшению ваших программ и проектов
Автор: Скотт Мейерс
Издательство: "ДМК", 2000
304 страницы
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.01.2014, 11:13  [ТС]     Сравнение при наследовании #3
Цитата Сообщение от DU Посмотреть сообщение
а задача похоже сведется к реализации двойной диспетчеризации (оно же мультиметоды):
C++
1
bool    overlap( virtual Shape& a, virtual Shape& b);
Похоже, только мне надо не пересечение. Дайте правильную декларацию потомков, если
C++
1
2
3
4
5
6
7
8
class A
{
 public:
  virtual A()=0;
  virtual ~A()=0;
  virtual bool operator ==(A &a)=0;
  virtual bool operator !=(A &a)=0;
};
, потомков ровно 4 и больше не станет, дальних потомков нет и не будет.
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,163
Завершенные тесты: 2
07.01.2014, 11:29     Сравнение при наследовании #4
Цитата Сообщение от taras atavin Посмотреть сообщение
virtual bool operator ==(A &a)=0;
* virtual bool operator !=(A &a)=0;
какой смысл несут операторы сравнения для интерфейса? ровным счетом никакого, немного изменил базовый класс
и вот пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
 
class A
{
    int _a;
public:
    A(int a): _a(a){}
    virtual ~A() = 0;
    virtual bool operator==(const A& rhs){ return _a == rhs._a;}
    virtual bool operator!=(const A& rhs){ return _a != rhs._a;}
};
 
A::~A(){}
 
class B : public A
{
    char _c;
public:
    B(int a, char var): A(a), _c(var){}
};
 
 
int main()
{
    B first(1, 'a'), second(2, 'b'), third(1, 'c');
    std::cout << std::boolalpha << "first == third: " <<(first == third) << "\n"
              << "second != third: " << (second != third)<< std::endl;
    return 0;
}
если в классах потомках не переопределять методы сравнения, то собственно сравнение будет происходить по правилам определенным в родительском классе, что абсолютно логично, то есть по полю char c в классе B сравнение, естественно, производится не будет
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.01.2014, 11:33  [ТС]     Сравнение при наследовании #5
Цитата Сообщение от Кудаив Посмотреть сообщение
вот пример
Пример чего? Фигню, не подходящую к задаче, я и сам могу слепить. Операторы предка не зря объявлены чисто виртуальными, без фактического класса левого операнда вообще не только нельзя построить алгоритм сравнения, но не известны даже подлежащие сравнению поля, они во всех четырёх потомках разные. B содержит четыре поля, C пять, D одно контейнерное, E два, из них одно контейнерное.
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,163
Завершенные тесты: 2
07.01.2014, 11:45     Сравнение при наследовании #6
Цитата Сообщение от taras atavin Посмотреть сообщение
не подходящую к задаче
тьфу, сразу не въехал... пардон
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.01.2014, 11:59  [ТС]     Сравнение при наследовании #7
Из максимально простого ближе всего подобие фигур. Не пересечение, так как и разнотипные фигуры могут как пересекаться, так и не пересекаться, а у меня при несовпадении фактических классов == должен возвращать false, а != true и только при совпадении классов операндов надо проверять данные. Но и равенство фигур не подходит, так как требуется возвращать true из оператора == в некоторых случаях неравенства данных полей. Равенство площадей не подходит по той же причине, что и пересечение.
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,163
Завершенные тесты: 2
07.01.2014, 12:11     Сравнение при наследовании #8
taras atavin, а полностью условие задачи выложить можете?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.01.2014, 12:40  [ТС]     Сравнение при наследовании #9
Требуется распарсить прототипы подпрограммы и перегруженных операторов с операторами заголовков
Код
function
,
Код
procedure
,
Код
operator like function
и
Код
operator like procedure
и попарно сравнить эти прототипы, при этом следует игнорировать различие в именах операторов/подпрограмм и в именах параметров, кроме того, если тип, входящий в правый прототип, приводится к типу, входящему в той же позиции в левый прототип, то эти типы считаются за один, приводимость же типов в левом прототипе к типам в правом прототипе игнорировать, учесть синонимичные типы. function и operator like function имеют тип возвращаемого значения, а proceure и operator like procedure нет. Фактические параметры operator like function и operator like procedure могут быть левыми и правыми, один оператор может иметь несколько правых операндов, разделяемых запятыми, их позиции индексируются, при парсинге информация заносится в поле-массив, есть флаги наличия левого операнда и заполненности массива правых операндов. Параметры function и procedure располагаются только в скобках, признака левый/правый не имеют, их позиции только индексируются, а при парсинге информация о параметрах заносится в массив, флагов нет. Базовый класс имеет чисто виртуальный метод восстановления текстового представления прототипов, либо готовое поле текстового представления прототипа. Кроме сравнения требуется также иметь доступ к каждому типу в протипе, при этом не желательно парсить его заново.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2014, 13:11     Сравнение при наследовании
Еще ссылки по теме:

C++ Ошибка при наследовании?
C++ Неоднозначность при наследовании
Деструктор при наследовании C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
07.01.2014, 13:11     Сравнение при наследовании #10
в задание не вникал. немного прокоментирую про двойную диспетчиризацию:
я так понял, вы не совсем поняли эту штуку, раз написали, что вам не пересечение.

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

двойная диспетчеризация - это зависимость поведения от реальных типов двух объектов:
C++
1
bool overlap(Shape& a, Shape& b);
аглоритм расчета пересечения зависит от того, что за типы у a и у b.

эта функция легко переделывается в метод:
C++
1
2
3
4
virtual bool overlap(Shape& b)
{
  return ::operlap(*this, b); // вызов свободной функции
}
у вас вместо overlap - operator =

о всяких там подходах в решении такой задачки, их плюсах и минусах - написано в книге, которую я указал в первом посте.
Yandex
Объявления
07.01.2014, 13:11     Сравнение при наследовании
Ответ Создать тему
Опции темы

Текущее время: 14:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru