Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Так зачем нужен чисто виртуальный деструктор? pure virtual destructor 
V
    Опции темы
jonie
Дата 17.7.2008, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



написал такой я код:
Выделить всёкод C++
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
//теперь А абстрактный
class A {
 public:
  virtual ~A()=0{}
};
//В не абстрактный - дестркутор не наследуется, 
//но т.к. A::~A виртуальный, 
//то нужно вызвать из ~B базовый ~A, 
//поэтому ~A определен в A.
class B : public A{};
....
B b;
....

Вопрос А нафига?) зачем нужны чисто виртуальные деструкторы? где могут пригодиться?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Annihilator
Дата 17.7.2008, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



Чтобы ты не забыл переопределить его в производном классе


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
Lazin
Дата 17.7.2008, 20:30 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



нигде
PM MAIL Skype GTalk   Вверх
Ulysses4j
Дата 17.7.2008, 21:05 (ссылка)   | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: 4
Всего: 10



Чисто виртуальные деструкторы нужны, чтобы явно сделать класс абстрактным с одной стороны(“чистота”), то есть запретить создавать его экземпляры (совет делать все базовые классы по возможности абстрактными часто упоминается при описании реализации ООП в C++), и, с другой (виртуальность), гарантировать корректное удаление экземпляров производных классов через указатель или ссылку на базовый.

Кстати, то, что у вас написано, у меня вообще не скомпилировалось. Скомпилировалось вот так:
Выделить всёкод C++
1:
2:
3:
4:
5:
6:
class Base {
public:
    virtual ~Base() = 0;
};
Base::~Base() {}

Как и продемонстрировано в книжке Мейерса “Эффективное использование C++”, в совете “Убедитесь, что базовые классы имеют виртуальные деструкторы” (в моем издании это 14-ый совет, в другом может отличаться). Более детальное обсуждение можно посмотреть там же.

Это сообщение отредактировал(а) Ulysses4j - 17.7.2008, 21:06


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
Annihilator
Дата 17.7.2008, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



Цитата(Ulysses4j @  18.7.2008,  01:05 Найти цитируемый пост)
Кстати, то, что у вас написано, у меня вообще не скомпилировалось

Так он пытается чисто виртуальной функции (деструктору) тело определить

Выделить всёкод C++
1:
Base::~Base() {}

нельзя этого делать

Это сообщение отредактировал(а) Annihilator - 17.7.2008, 21:08


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
Lazin
Дата 17.7.2008, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Объект с чисто виртуальным деструктором нельзя использовать, так как при удалении объекта вызывается его деструктор, а потом деструктор его базового класса,..
PM MAIL Skype GTalk   Вверх
Ulysses4j
Дата 17.7.2008, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: 4
Всего: 10



Annihilator, можно. Для деструктора можно, это единственное исключение. Почитайте Мейерса. Это продиктовано жестким порядком вызова деструкторов в иерархии классов, как сказал Lazin.


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
Torsten
Дата 17.7.2008, 21:52 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 10.6.2008
Где: Pskov

Репутация: 3
Всего: 7



Цитата(jonie @  17.7.2008,  20:13 Найти цитируемый пост)
Вопрос А нафига?) зачем нужны чисто виртуальные деструкторы? где могут пригодиться?

Если других чисто виртуальных функций нет, но нужно сделать класс абстракным.


Цитата(Ulysses4j @  17.7.2008,  21:30 Найти цитируемый пост)
Annihilator, можно. Для деструктора можно, это единственное исключение. 

Это не единственное исключение. Можно делать класс с чисто виртуальными функциями, имеющими тело. 
--------------------
We have no begining, we have no end. We are infinite.
PM MAIL   Вверх
Ulysses4j
Дата 17.7.2008, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: 4
Всего: 10



Цитата(Torsten @ 17.7.2008,  22:52)
Цитата(Ulysses4j @  17.7.2008,  21:30 Найти цитируемый пост)
Annihilator, можно. Для деструктора можно, это единственное исключение. 

Это не единственное исключение. Можно делать класс с чисто виртуальными функциями, имеющими тело.

Вот ведь: век живи — век учись. 

Совершенно верно: “чистота” виртуальной функции класса запрещает создание экземпляра этого класса в любом случае и позволяет не определять тело данной функции, но не запрещает сделать это.


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
jonie
Дата 17.7.2008, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



1. определять тело можно для любых чисто-виртуальных методов (включая дестркутор).
так что Annihilator гонит, а трое что поставили ему +3 плохо учились))
2.
Цитата

Объект с чисто виртуальным деструктором нельзя использовать, так как при удалении объекта вызывается его деструктор, а потом деструктор его базового класса,..
это тож неправда. мой пример это демонстрирует.
3.вот это мне более-менее понравилось...
Цитата

Если других чисто виртуальных функций нет, но нужно сделать класс абстракным.
впрочем, я могу запретить создание экземпляра класса и так:
Выделить всёкод C++
1:
2:
3:
4:
5:
6:
7:
8:
//экземпляр объекта типа А создать нельзя
class A {
 protected:
    A(){}
};
//а вот наследоваться - пожалуйста.
class B : public A {};
но эт уж не абстрактность....
этим ответом я думаю можно и закончить... если нету еще мыслей....



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
JackYF
Дата 17.7.2008, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(jonie @  17.7.2008,  22:33 Найти цитируемый пост)
впрочем, я могу запретить создание экземпляра класса и так:

И любой наследник сможет создать экземпляр твоего класса. И френд тоже.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
UnrealMan
Дата 18.7.2008, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Ulysses4j @  17.7.2008,  21:05 Найти цитируемый пост)
Кстати, то, что у вас написано, у меня вообще не скомпилировалось. 

И не должно - стандарт не разрешает определять чисто виртуальную функцию внутри определения класса.
PM MAIL   Вверх
jonie
Дата 18.7.2008, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



пункт стандарта, если смотрели, подскажите...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
UnrealMan
Дата 18.7.2008, 10:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



PM MAIL   Вверх
Annihilator
Дата 18.7.2008, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



Цитата(jonie @  18.7.2008,  03:33 Найти цитируемый пост)
определять тело можно для любых чисто-виртуальных методов (включая дестркутор)

точно, сам проверил щас
Цитата(jonie @  18.7.2008,  03:33 Найти цитируемый пост)
так что Annihilator гонит

да не хотел я никого обманывать...   честно smile



--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0822 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.