Сравнение полиморфных базовых типов в C++ без RTTI

У меня есть несколько указателей на базовый тип 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 ==
}
7
задан oggmonster 4 July 2012 в 15:38
поделиться