Я бы все равно следовал общему правилу для классов, которые должны быть получены:
Предоставить либо общедоступный виртуальный деструктор, либо защищенный не виртуальный деструктор
Причина в том, что вы не можете контролировать все виды использования, и это простое правило означает, что компилятор установит флаг, если вы попытаетесь delete
пройти неправильный уровень в иерархии.Учтите, что shared_ptr
не гарантирует, что он вызовет соответствующий деструктор, только то, что он вызовет деструктор статического типа, который использовался в качестве аргумента:
base* foo();
shared_ptr<base> p( foo() );
Если base
имеет открытый не-virtual destructor и foo
возвращает тип, производный от base
, тогда shared_ptr
не сможет вызвать правильный деструктор.Если деструктор base
является виртуальным, все будет хорошо, если он защищен, компилятор сообщит вам, что там есть ошибка.