Два фундаментальных свойства в C ++: созданный объект никогда не меняет своего типа, а инициализированная ссылка всегда ссылается на один и тот же объект.
Здесь происходит то, что вы вызываете компиляторпоставляется не виртуальным operator=
для Parent
, что почти наверняка не то, что вы хотели.В более общем смысле, однако, присваивание и наследование не работают вместе (именно потому, что вы не можете изменить тип объекта);В большинстве случаев при использовании наследования вы должны запретить присваивание (например, наследуя от boost::noncopyable
).Можно реализовать семантику значений для полиморфного класса, используя идиому буквы / конверта, но это сложное решение и редко подходящее.
(Я мог бы добавить, что ваш код не компилируется с компилятором C ++. Вы инициализируете ссылку на неконстантное с помощью временного, что недопустимо в C ++. Допускается, что это расширение Microsoft.)