оператор == с двойной диспетчеризацией в C ++ - PullRequest
3 голосов
/ 28 июля 2010

Как следует реализовать

operator==(const Base& base)

для сравнения подклассов, если вызовы будут правильно отправляться при вызове

Base* base1 = new Derived1();
Base* base2 = new Derived2();
base1->operator==(*base2)?

Ответы [ 2 ]

6 голосов
/ 28 июля 2010
  1. Реализуйте оператор == как автономную функцию.
  2. Пусть он вызовет виртуальный метод для одного из аргументов (например, IsEqual ())

Это даетВы к точке, где у вас есть

Derived1::IsEqual(const Base& base)

Called.Отсюда у вас есть несколько вариантов

  1. Использовать RTTI для dynamic_cast <> base для Derived1
  2. Если число производных мало и конечно, вы можете реализовать

    virtual bool Base::IsEqualToDerived(const Derived1& d) {return false};
    virtual bool Base::IsEqualToDerived(const Derived2& d) {return false};
    

как виртуальные методы.В Derived1 вы переопределяете и сравниваете по-настоящему.

1 голос
/ 28 июля 2010

Это похоже на общий вопрос C ++ о классах и типах, а не конкретный вопрос об операторе ==.Насколько мне известно, в конкретном примере, который вы приводите, нет другого пути, кроме как использовать dynamic_cast

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...