Сравнение объектов и наследования - PullRequest
1 голос
/ 13 мая 2010

В моей программе есть следующая иерархия классов:

class Base // Base is an abstract class
{
};

class A : public Base
{
};

class B : public Base
{
};

Я хотел бы сделать следующее:

foo(const Base& one, const Base& two)
{
  if (one == two)
  {
    // Do something
  } else
  {
    // Do something else
  }
}

У меня есть проблемы, связанные с operator==() здесь.Конечно, сравнивать экземпляр A и экземпляр B не имеет смысла, но сравнение двух экземпляров Base должно быть возможным.(Вы не можете сравнивать собаку и кошку, однако вы можете сравнить двух животных)

Я хотел бы получить следующие результаты:

A == B => false

A == A => true или false, в зависимости от действующего значения двух экземпляров

B == B => true или false, в зависимости от эффективного значения двух экземпляров

Мой вопрос: это хороший дизайн / идея?Это вообще возможно?Какие функции я должен писать / перегружать?

Ответы [ 3 ]

3 голосов
/ 13 мая 2010
class Base // Base is an abstract class
{
    virtual bool equals(const Base& b) = 0;
};

class A : public Base
{
    virtual bool equals(const Base& base)
    {
        if (const A* a = dynamic_cast<const A*>(&base))
        {
            // Return true iff this and a are equal.
        }
        return false;
    }
};

class B : public Base
{
    virtual bool equals(const Base& base)
    {
        if (const B* b = dynamic_cast<const B*>(&base))
        {
            // Return true iff this and b are equal.
        }
        return false;
    }
};
1 голос
/ 13 мая 2010

Перегрузка оператора в базе: ссылки на подклассы будут приведены к ссылке на базовый класс.

Не вижу проблем с дизайном - не без контекста.

0 голосов
/ 13 мая 2010

Я не могу создать контрпример прямо сейчас, но, насколько я помню, оператор сравнения (как нечто транзитивное, рефлексивное и симметричное) будет всегда прерываться (и быть источником вредоносных ошибок)в сочетании с наследством.Возможно, это не сломает ваше приложение, ваш сценарий использования, всего через полгода, когда вы создадите подкласс для своего подкласса ...

...