Подтвердить что ты не робот

Защищенный против частного деструктора

Есть ли разница между защищенным и приватным деструктором в С++? Если деструктор базовых классов является закрытым, я предполагаю, что он все еще вызывается при удалении объекта производного класса.

4b9b3361

Ответ 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

Ответ заключается в том, что ваше предположение неверно. Деструктор базового класса нельзя вызвать, когда он является приватным.