Есть ли разница между защищенным и приватным деструктором в С++? Если деструктор базовых классов является закрытым, я предполагаю, что он все еще вызывается при удалении объекта производного класса.
Защищенный против частного деструктора
Ответ 1
Взято из здесь:
Если конструктор/деструктор объявлен как закрытый, то класс не может быть создан.
Это верно, однако он может быть создан из другого метода в классе. Аналогично, если деструктор private
, то объект может быть удален только внутри класса. Кроме того, это предотвращает унаследование класса (или, по крайней мере, предотвращает создание или уничтожение унаследованного класса вообще).
Ответ 2
Если деструктор базового класса private
или protected
, вы не можете вызвать delete
через указатель базового класса.
Используйте защищенный деструктор, чтобы предотвратить уничтожение производного объекта с помощью указателя базового класса. Он ограничивает доступ к destuctor для производных классов. И это предотвращает автоматическое (стек) объектов базы классов.
По сути, он используется для другое полиморфное использование полученных классы с помощью указателей на базу, но не разрешить пользователям удалять, используя указатель. Пример: - Абстрактные базовые классы/интерфейсы.
Но деструктор a protected
, non-virtual
кажется ошибкой, ожидающей своего появления. Предполагая, что вы не предоставляете функцию destroy()
, вы должны в конечном итоге сделать dtor public. Как только вы это сделаете, у вас больше не будет контроля над классом, а также риск полиморфного удаления с помощью не виртуального dtor, если кто-то получит дальнейшее развитие от вашего класса.
Ответ 3
Следующий фрагмент кода приведет к ошибке компилятора (VC2010): C2248: 'base:: ~ base': не может получить доступ к закрытому члену, объявленному в классе 'base'
class base
{
~base(){}
};
class derived : public base
{
};
int main ()
{
derived* d = new derived;
delete d;
}
Однако, если вы измените базовый деструктор, который будет защищен, все будет работать нормально.
Ответ 4
Ответ заключается в том, что ваше предположение неверно. Деструктор базового класса нельзя вызвать, когда он является приватным.