Я пытаюсь сравнить объекты общего базового класса вместе. Сравнение должно завершиться неудачно (например, вывести строку ошибки) в любом случае, когда два объекта различаются по классу или значениями, специфичными для объекта. В идеале сравнение должно быть каким-то образом принудительно, так что новый производный класс также должен был бы написать функцию сравнения для членов своего класса. Вот пример кода:
#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;
}
В настоящее время в выходных данных (которые вы можете увидеть здесь ) говорится: «Мы разные машины». Я знаю, что это происходит, потому что я использую абстрактный базовый указатель.Проблема в том, как это исправить!
Я хотел бы получить вывод, что велосипеды выводят, что они одинаковы, потому что у них действительно один и тот же цвет. Велосипеды и автомобили должны выводить, что это разные транспортные средства. Велосипеды разных цветов и автомобили разных стилей также должны выводить, что они разные. Я чувствую, что должен быть отличный шаблон для решения этой проблемы, но я погряз в динамическом преобразовании или небезопасном понижающем преобразовании. Кроме того, я хотел бы, чтобы функция сравнения применялась среди членов одного класса (чтобы велосипеды могли сравниваться с другими велосипедами).