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