Мне на самом деле надоело видеть в тестах C ++ вопрос о том, как будет вести себя в этой ситуации.Они хотят, чтобы вы ответили, что он вызовет деструктор А, а не Б.
Это не гарантированное поведение, и вы не можете на него полагаться.Неопределенное поведение означает, что вы не можете быть уверены в том, что произойдет, и это имеет место здесь.
Это также пример "просто не делайте этого ..".В моей последней работе я полностью удалил тест из системы, которая проверяла это поведение на том основании, что оно неуместно и не по теме.
Альтернативный вариант создания виртуального деструктора a
- сделать его защищенным.,Это также защитит вас в том, что main()
не удастся скомпилировать, поскольку вы не можете вызвать delete var
оттуда.Вы даже не можете вызвать неопределенное поведение в b
, выполнив то же самое, что делает main
, потому что вы можете быть удивлены, но delete
для a*
также будет недоступен.
boost::shared_ptr<a>( new b );
безопасно, так как это создаст удалитель для b, а не для a.
Поскольку в a
есть еще одна виртуальная функция, хотя вы почти наверняка должны выбрать виртуальный деструктор.