То, с чем вы столкнулись, это нарезка объектов - в частности, ваш unordered_set<int, A>
может содержать только объекты типа A. Когда вы пытаетесь поместить в него объект типа B
, он компилируется, но только часть суперкласса объекта B
фактически копируется в структуру данных - часть подкласса (то есть часть * 1006). * объект, который не является частью суперкласса A
) "обрезается" и отбрасывается, а то, что хранится в наборе, является просто еще одним A
.
Если вы хотите, чтобы ваш unordered_set
содержал значения различных подклассов, тогда единственный способ сделать это - сохранить объекты-значения косвенно через некоторый указатель; например, вместо этого вы можете использовать unordered_set<int, A*>
или, что еще лучше, unordered_set<int, shared_ptr<A> >
(так что вы будете защищены от утечек памяти). Затем вам нужно выделить каждый объект A / B в куче, прежде чем вставлять его в набор.
(Альтернативным подходом было бы сохранить отдельные unordered_set
для каждого подкласса, например, иметь unordered_set<int, A>
и a unordered_set<int, B>
. Конечно, недостатком является усложнение вашего кода вызова ) * * тысяча двадцать-один