Увидели некоторые связанные вопросы, но не этот точный...
Я рассматривал классы как подходящие для нескольких основных категорий, скажем, эти четыре для простоты:
-
Классы значений, которые имеют некоторые данные и множество операций. Они могут быть скопированы и осмысленно сопоставлены для равенства (при этом копии должны быть равны через
==
). Этим почти всегда не хватает виртуальных методов. -
Уникальные классы, чьи экземпляры имеют идентификатор, который вы отключите назначение и копирование. Обычно на них нет
operator==
, потому что вы сравниваете их как указатели, а не как объекты. У них довольно часто много виртуальных методов, так как нет риска object-slicing, поскольку вы вынуждены передавать их указателем или ссылкой. -
Уникальные, но клонируемые классы, которые запрещают копирование, но предварительно разработаны для поддержки клонирования, если это то, что вы действительно хотите. У них есть виртуальные методы, наиболее важные из которых следуют виртуальная конструкция/клонирование идиомы
-
Контейнерные классы, которые наследуют свойства того, что они держат. Они, как правило, не имеют виртуальных методов... см. например "Почему контейнеры STL не имеют виртуальных деструкторов?" .
Независимо от того, чтобы придерживаться этой неофициальной системы убеждений, пару раз я пытался добавить виртуальный метод к чему-то, что можно скопировать. Хотя я, возможно, подумал, что "будет действительно здорово, если это сработает", неизбежно это ломается.
Это заставило меня задаться вопросом, есть ли у кого-нибудь хороший пример того типа, который имеет виртуальные методы и не отключает копирование?