Нельзя обрезать остальную часть объекта, сохраняя идентичность базового субобъекта.Вы можете создать новую копию базового подобъекта и выбросить производный объект.
В настоящее время вы создаете несвязанный объект в crash
, и поэтому m_treasures
не будет затронут m_treasures
изранее указанный объект.Чтобы создать копию исходного базового подобъекта, вы можете сделать:
b = make_shared<SomethingSwimming>(*b);
В качестве альтернативы, на сайте вызова вы можете обрабатывать косвенно ссылающуюся базу, как если бы она не была частью производного объектавызывая виртуальные функции-члены статически:
a->SomethingSwimming::howManyLobstersOnBoard()
Это приведет к значению m_treasures
независимо от самого производного типа объекта.