«Шахматные фигуры не являются абстрактными»: это звучит как странная интерпретация ООП: обычно класс представляет собой нечто абстрактное (например, идею / концепцию человека или ладью в платоническом смысле). Экземпляр класса обычно представляет что-то конкретное, например, Джон Смит или левый рыцарь на моей шахматной доске с отсутствующим ухом. Таким образом, пешка, ладья, рыцарь - идеальные кандидаты для классов, а «шахматная фигура» - суперкласс, потому что все они подпадают под этот класс в силу того, что являются пешкой, ладьей или рыцарем.

я есть базовый класс для штук

 class piece;

и массив, содержащий производные объекты

piece* board[8][8];

Преимущество, чистый дизайн с помощью виртуальных функций. Недостаток: если мне нужно найти фигуру на доске или сравнить фигуру, я должен вернуться к динамическому касту (или typeid). Это ужасно и может привести к снижению производительности при выполнении миллионов запросов.

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

Это для развлечения (так что без битборда).

РЕДАКТИРОВАТЬ 1

Читая некоторые ответы, я думаю, что использование полей типа только для перегрузки операторов (==,! = ...) может принести лучшее из обоих слов.

Вариант boost :: тоже выглядит очень интересно.

Ответы на вопрос(6)

Ваш ответ на вопрос