Сравнение производных классов в C ++ без динамического преобразования или статического преобразования с понижением

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

#include 
#include 
#include 

class Vehicle 
{ 
public:
  virtual std::string compareTo(Vehicle* v) = 0;
};

class Bicycle : public Vehicle
{
public:
  Bicycle() { color_ = "red"; }
  std::string compareTo(Vehicle* v) { return "We're different vehicles."; }
  std::string compareTo(Bicycle* b) { return color_.compare(b->color_) ? "We're different bicycles." : "We're the same bicycle."; }

private:
  std::string color_;
};

class Car : public Vehicle
{
public:
  Car() { style_ = "sedan"; }
  std::string compareTo(Vehicle* v) { return "We're different vehicles."; }
  std::string compareTo(Car* c) { return style_.compare(c->style_) ? "We're different cars." : "We're the same car."; }

private:
  std::string style_;
};

int main()
{
  Vehicle* compareFrom = new Bicycle();

  std::vector compareTos;
  compareTos.push_back(new Bicycle());
  compareTos.push_back(new Car());

  std::vector::iterator it;
  for (it = compareTos.begin(); it != compareTos.end(); ++it)
    std::cout << compareFrom->compareTo(*it) << std::endl;

  return 0;
}

В настоящее время в выходных данных (которые вы можете увидеть здесь ) говорится: «Мы разные машины». Я знаю, что это происходит, потому что я использую абстрактный базовый указатель.Проблема в том, как это исправить!

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

9
задан aardvarkk 26 January 2012 в 17:01
поделиться