Каждый должен знать, что присвоение является ковариантным двоичным оператором и поэтому не может корректно работать с виртуальными функциями.Это верно для большинства бинарных операторов, но присваивание является особенным, потому что оно является частью языка C ++.
Если вы используете OO, ваши объекты должны быть некопируемыми и всегда представлены указателями.Уникальность идентичности объекта является сердцем ОО: объекты не являются значениями, они имеют уникальное значение (их адрес).
Если вы играете со значениями, вы должны использовать соответствующие понятия: функциональное программирование (ФП).Это замыкания (аппликативные объекты), переключатели, шаблоны, варианты и другие вещи.
Постарайтесь получить четкое представление о каждом из них, прежде чем смешивать их.В общем случае FP включает в себя OO, так же как и общая методология: OO - это особый случай, который в особых обстоятельствах обеспечивает безопасную динамическую диспетчеризацию.OO диспетчеризация является линейной, что означает, что она обрабатывает неограниченный набор подтипов, но она также применяется только к свойствам (функциям с одним альтернативным аргументом, а именно объекту) и не может работать для чего-либо более высокого порядка (функции с более чем одним вариантным аргументом).Назначение - это просто еще одна 2-х функция, следовательно, ее нельзя передать виртуальными функциями.