Как сравнить два указателя на объект по их наиболее производному типу? - PullRequest
0 голосов
/ 11 октября 2009

У меня есть следующая иерархия классов:

class Base{
....
virtual bool equal(Base *);
}

class Derived1: public Base{
....
virtual bool equal(Base *);
}
class Derived2: public Derived1{
}
class Derived3: public Derived1{
}
class Derived4: public Base{
}

Как мне написать функцию Base :: equal (Base *), которая сравнивает Derived4 и аналогичные классы? У них нет полей данных, поэтому проверяйте только, что фактические объекты принадлежат к одному и тому же производному классу.

А как записать Derived1 :: equal (Base) - Derived2 и Derived3 похожи, они не имеют никакого поля данных и должны сравниваться по полям данных в Derived1 и проверить, что объекты из одного и того же производного класса?

Обновление: Я хочу этого, потому что я не хочу писать идентичные функции для каждого производного класса, такие как:

bool Derived::equal(Base *b){ 
  Derived *d = dynamic_cast<Derived*>(b); 
  return d; 
} 

Ответы [ 2 ]

3 голосов
/ 11 октября 2009

Универсальный метод, который можно использовать для полиморфных сравнений между типами, называется «двойной диппатч» (см. Двойная отправка ). Это может быть применено к вашей конкретной проблеме, и в этом случае вы получите кучу перегруженных функций с почти пустыми телами, просто возвращая либо «false», либо «true».

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

2 голосов
/ 11 октября 2009

Я думаю, вы можете использовать оператор typeid здесь. Вы можете сделать что-то вроде:

typeid(*pointerBase) == typeid(*this);

Но почему вы хотите сделать что-то подобное? Это выглядит очень подозрительно, предлагаю взглянуть на дизайн.

...