![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
gr1fon |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 9.8.2007 Репутация: 1 Всего: 1 |
class A
{ public: virtual ~A() = 0; }; |
|||
|
||||
Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 4 Всего: 67 |
виртуальные деструкторы используют для того чтобы гарантировать в каждом из наследников реализацию деструктора....
-------------------- СУВ, Partizan. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Это абстрактный класс. Он не разрешает создание объектов. Он требует, чтобы были потомки со своими деструкторами (точнее, хотя бы один потомок).
|
|||
|
||||
Fazil6 |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
это сделано для того, чтобы класс был абстрактным (нельзя создавать экземпляры A) и использовался как базовый. Вообще-то здесь довольно бессмысленный класс, так как он вроде как должен быть базовым, но интерфейса никакого не объявлено. Кстати реализация деструктора тоже должна быть в этом классе A/
хм... интересная мысль... Вообще-то деструктор виртуальный нужен для правильного вызова деструкторов при разрушении объекта при полиморфном использовании и совсем не обязательно явно реализовывать деструкторы в наследниках, даже если в базовом он виртуальный. |
||||
|
|||||
Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: нет Всего: 12 |
Как абсолютно правильно уже указали, это абстрактный класс.
Запись вида
называется "чисто виртуальной функцией" (pure virtuale). При наличии хотя бы одной такой функции класс становится абстрактным. Это означает, что вы не можете создавать объекты такого класса, а виртуальные функции обязательно должны быть переопределены в производных классах. Однако, вы можете пользоваться указателем на объект такого класса при реализации полиморфности. Деструктор же делается виртуальным для того, чтобы при уничтожении объекта базового класса был вызван деструктор производного класса. -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
||||
|
||||
Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 4 Всего: 67 |
Fazil6, согласен
-------------------- СУВ, Partizan. |
|||
|
||||
sentry |
|
||||||
Code Monkey ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 29.1.2007 Где: Москва Репутация: 1 Всего: 10 |
Переопределять чисто виртуальный деструктор в производных классах не обязательно...
Это прекрасно компилится. |
||||||
|
|||||||
Fazil6 |
|
||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
оно же не скомпилится если нет реализации. Хоть базовый клас и абстрактный, но при удалении потомка последним должен вызываться деструктор базового, поэтому реализован он должен быть полюбому. Например так
ну вобщем обычно так делают если класс д.б. абстрактным, но, например, нету других методов виртуальных или все они имеют рееализацию в базовом классе |
||||||
|
|||||||
zkv |
|
||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
накидал пример
выяснилось: - объявление метода абстрактным говорит о том, что у него может (я считал, что должно) отсутствовать определение -
а, он (компилятор) его по умолчанию туда затолкает наверное. Это сообщение отредактировал(а) zkv - 17.8.2007, 15:58 |
||||
|
|||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
sentry |
|
|||
Code Monkey ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 29.1.2007 Где: Москва Репутация: 1 Всего: 10 |
Да, компилятор автоматически создает определение деструктора для каждого класса, не имеющего его определения. Кстати, именно поэтому производные классы не являются абстрактными. Насколько я понимаю, чисто виртуальный деструктор нужен только для того, чтобы нельзя было создать экземпляр базового класса. И все. |
|||
|
||||
UnrealMan |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Вот так стандарт как раз-таки не разрешает:
Добавлено через 3 минуты и 36 секунд
Не имеющего его объявления ![]() |
||||||||
|
|||||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |