У меня есть несколько указателей на базовый тип Shape. Я хочу сравнить эти объекты с помощью оператора ==. Очевидно, что оператор == должен возвращать false, если объекты относятся к разным производным типам. Однако если они относятся к одному и тому же производному типу, следует сравнить члены производного типа.
Я читал, что использование C++ RTTI является плохой практикой и должно использоваться только в редких и существенных обстоятельствах. Насколько я понимаю, эту проблему вообще невозможно решить без использования RTTI. Каждый перегруженный оператор == должен будет проверять идентификатор типа и, если они совпадают, выполнять динамическое приведение _и сравнивать элементы. Это похоже на общую потребность. Есть ли какая-то идиома для этой проблемы?
#include <iostream>
using namespace std;
class Shape {
public:
Shape() {}
virtual ~Shape() {}
virtual void draw() = 0;
virtual bool operator == (const Shape &Other) const = 0;
};
class Circle : public Shape {
public:
Circle() {}
virtual ~Circle() {}
virtual void draw() { cout << "Circle"; }
virtual bool operator == (const Shape &Other) const {
// If Shape is a Circle then compare radii
}
private:
int radius;
};
class Rectangle : public Shape {
public:
Rectangle() {}
virtual ~Rectangle() {}
virtual void draw() { cout << "Rectangle"; }
virtual bool operator == (const Shape &Other) const {
// If Shape is a Rectangle then compare width and height
}
private:
int width;
int height;
};
int main() {
Circle circle;
Rectangle rectangle;
Shape *Shape1 = &circle;
Shape *Shape2 = &rectangle;
(*Shape1) == (*Shape2); // Calls Circle ==
(*Shape2) == (*Shape1); // Calls Rectangle ==
}