«Шахматные фигуры не являются абстрактными»: это звучит как странная интерпретация ООП: обычно класс представляет собой нечто абстрактное (например, идею / концепцию человека или ладью в платоническом смысле). Экземпляр класса обычно представляет что-то конкретное, например, Джон Смит или левый рыцарь на моей шахматной доске с отсутствующим ухом. Таким образом, пешка, ладья, рыцарь - идеальные кандидаты для классов, а «шахматная фигура» - суперкласс, потому что все они подпадают под этот класс в силу того, что являются пешкой, ладьей или рыцарем.
я есть базовый класс для штук
class piece;
и массив, содержащий производные объекты
piece* board[8][8];
Преимущество, чистый дизайн с помощью виртуальных функций. Недостаток: если мне нужно найти фигуру на доске или сравнить фигуру, я должен вернуться к динамическому касту (или typeid). Это ужасно и может привести к снижению производительности при выполнении миллионов запросов.
С другой стороны, если я создаю массив из одного класса элементов, который имеет поле типа для идентификации элементов, у меня не будет этой проблемы (и она должна быть быстрее), но мне придется делать супер уродливые операторы switch. Я предполагаю, что, поскольку количество произведений конечно, и я не вижу, чтобы я делал так много переключателей, это, в конце концов, могло бы стать лучшим выбором, как вы думаете?
Это для развлечения (так что без битборда).
РЕДАКТИРОВАТЬ 1
Читая некоторые ответы, я думаю, что использование полей типа только для перегрузки операторов (==,! = ...) может принести лучшее из обоих слов.
Вариант boost :: тоже выглядит очень интересно.