powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Зачем в базовом классе делают деструктор, отличный от public и даже отличный от virtual?
11 сообщений из 11, страница 1 из 1
Зачем в базовом классе делают деструктор, отличный от public и даже отличный от virtual?
    #39103995
log_here
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для чего это делается и как корректно удаляется объект, созданный на куче или в стеке(в виде автоматической переменной) при деструкторе базового класса, отличного от public virtual?
...
Рейтинг: 0 / 0
Зачем в базовом классе делают деструктор, отличный от public и даже отличный от virtual?
    #39104006
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_here,
про virtual: если класс не планируется делать базовым, то и нет смысла делать виртуальный деструктор.
про non-public: используется для реализации паттерна синглтон, он же - одиночка. Класс создаётся и удаляется через специальные статические функции, и, естественно, только в динамической памяти. Собственно, спрятать деструктор в private - простейший способ запретить создавать класс на стеке.
...
Рейтинг: 0 / 0
Зачем в базовом классе делают деструктор, отличный от public и даже отличный от virtual?
    #39104008
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_hereДля чего это делается и как корректно удаляется объект, созданный на куче или в стеке(в виде автоматической переменной) при деструкторе базового класса, отличного от public virtual?
Попробуйте рассмотреть ситуацию "наоборот". :) Если вы собираетесь использовать полиморфизм применительно к деструктору, то вам нужен виртуальный паблик деструктор.
Если вы не собираетесь это делать, то деструктор не должен быть виртуальным.

Деструктор базового класса должен быть либо public&virtual, либо protected&non-virtual
...
Рейтинг: 0 / 0
Зачем в базовом классе делают деструктор, отличный от public и даже отличный от virtual?
    #39104014
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДДеструктор базового класса должен быть либо public&virtual, либо protected&non-virtual
Второе требование (protected&non-virtual) означает отказ от расширения функциональности через наследование. Т.е. невозможен случай когда и базовый класс и наследник могут напрямую использоваться в программе.
Например, пусть есть готовый класс String, а мы хотим создать класс String2 где все тоже плюс хранится кодировка строки. Но мы заходим на sql.ru и там сказано нельзя public non-virtual destructor, и все, придется вместо наследования делать агрегацию с методами обертками ))
...
Рейтинг: 0 / 0
Зачем в базовом классе делают деструктор, отличный от public и даже отличный от virtual?
    #39104016
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВторое требование (protected&non-virtual) означает отказ от
расширения функциональности через наследование.
Это, очевидно, было ещё до того, как в стандарт ввели слово final.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зачем в базовом классе делают деструктор, отличный от public и даже отличный от virtual?
    #39104019
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyчччДДеструктор базового класса должен быть либо public&virtual, либо protected&non-virtual
Второе требование (protected&non-virtual) означает отказ от расширения функциональности через наследование...

"А я что сказал?" - (с) :)
...
Рейтинг: 0 / 0
Зачем в базовом классе делают деструктор, отличный от public и даже отличный от virtual?
    #39104049
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД"А я что сказал?" - (с) :)
Так я и говорю - бессмысленное требование, полностью противоречащее мультипарадигменности С++.
С таким же успехом можно запретить указатели или еще какую -нибудь глупость придумать. ))
...
Рейтинг: 0 / 0
Зачем в базовом классе делают деструктор, отличный от public и даже отличный от virtual?
    #39104090
log_here
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДПопробуйте рассмотреть ситуацию "наоборот". :) Если вы собираетесь использовать полиморфизм применительно к деструктору, то вам нужен виртуальный паблик деструктор.
Если вы не собираетесь это делать, то деструктор не должен быть виртуальным.

Деструктор базового класса должен быть либо public&virtual, либо protected&non-virtual

Всё правильно в коде и комментариях?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 
class Base { protected: ~Base(); }; 
class Derived : public Base { public: virtual ~Derived(); }; 
class Derived2 : public Derived{ public: virtual ~Derived2(); }; 

Derived d;          // удалится корректно
Derived2 d2;       // удалится корректно

Base* base = new Derived(); // удалится некорректно
delete base;

Derived* derived = new Derived2(); // удалится корректно
delete derived;
...
Рейтинг: 0 / 0
Зачем в базовом классе делают деструктор, отличный от public и даже отличный от virtual?
    #39104142
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_hereЗачем в базовом классе делают деструктор, отличный от public

Не public деструкторы делают, чтобы запретить создание объектов везде, кроме как в динамической памяти.
На стеке и статически такой объект уже нельзя будет создать, потому что компилятор потребует вызов
деструктора, и не сможет его найти. Такие объекты можно будет создать (а главное удалять) только из кода самого этого класса (private destructor)
или ещё и из кода наследников (protected destructor).

log_hereи даже отличный от virtual?


Не понятно, почему "даже" -- область видимости и виртуальность деструктора никак не связаны.
Обычно деструктор делают виртуальным, только если это нужно. В других случаях не делают этого.

log_hereДля чего это делается и как корректно удаляется объект, созданный на куче или в стеке(в виде автоматической переменной) при деструкторе базового класса, отличного от public virtual?

Кажется, я уже это пояснил. Никак. Нужно будет удалять объект только из кода самого класса или наследников, ну и friend-ы, конечно.
Обычно делают для этого специальные функции создания и уничтожения объектов этих классов. Если иерархия, то часто создание идёт через фабрики класса.
...
Рейтинг: 0 / 0
Зачем в базовом классе делают деструктор, отличный от public и даже отличный от virtual?
    #39104146
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyчччДДеструктор базового класса должен быть либо public&virtual, либо protected&non-virtual
Второе требование (protected&non-virtual) означает отказ от расширения функциональности через наследование. Т.е. невозможен случай когда и базовый класс и наследник могут напрямую использоваться в программе.
Например, пусть есть готовый класс String, а мы хотим создать класс String2 где все тоже плюс хранится кодировка строки. Но мы заходим на sql.ru и там сказано нельзя public non-virtual destructor, и все, придется вместо наследования делать агрегацию с методами обертками ))

Я согласен с твоей критикой высказываний товарища Ч, но у тебя тоже не всё так однозначно, как ты пишешь.
Накладываемые ограничения на самом деле гораздо слабее, чем "отказ от расширения функциональности через наследование"
Невиртуальный деструктор накладывает только одно ограничение -- не удалять объект через полиморфный указатель (указатель на базовый класс). protected деструктор -- только что удаление может быть в коде класса, наследников или друзей.
...
Рейтинг: 0 / 0
Зачем в базовом классе делают деструктор, отличный от public и даже отличный от virtual?
    #39104147
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_hereчччДПопробуйте рассмотреть ситуацию "наоборот". :) Если вы собираетесь использовать полиморфизм применительно к деструктору, то вам нужен виртуальный паблик деструктор.
Если вы не собираетесь это делать, то деструктор не должен быть виртуальным.

Деструктор базового класса должен быть либо public&virtual, либо protected&non-virtual

Всё правильно в коде и комментариях?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 
class Base { protected: ~Base(); }; 
class Derived : public Base { public: virtual ~Derived(); }; 
class Derived2 : public Derived{ public: virtual ~Derived2(); }; 

Derived d;          // удалится корректно
Derived2 d2;       // удалится корректно

Base* base = new Derived(); // удалится некорректно
delete base;

Derived* derived = new Derived2(); // удалится корректно
delete derived;



Да, всё правильно, с учётом того, что код должен быть помещён в соотв. места.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Зачем в базовом классе делают деструктор, отличный от public и даже отличный от virtual?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]