Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Antonioni
0 / 0 / 0
Регистрация: 17.07.2014
Сообщений: 12
#1

Обязательно ли объявление виртуального деструктора в абстрактном классе - C++

12.08.2014, 10:48. Просмотров 1316. Ответов 25
Метки нет (Все метки)

Недавно выполнял задание, и забыл в абстрактном классе(использовалось наследование) объявить виртуальный диструктор. С точки зрения профессионального программирования, является ли это серьёзной ошибкой?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2014, 10:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обязательно ли объявление виртуального деструктора в абстрактном классе (C++):

Магия виртуального деструктора - C++
Если убрать определение virtual (стр. 18), то вызывается (47) только деструктор класса Person (деструктор Student не вызывается). Вопрос:...

Объяснить использование виртуального деструктора - C++
Ребят для чего здесь используется виртуальный деструктор? using namespace std; class Ostanovki { protected: char* name; ...

Написание функций, которые объявлены в абстрактном классе - C++
Добрый день. Подскажите, как написать тело функций, которые объявлены в абстрактном классе. Абстрактный класс: class OSM_EXPORT...

Возвращаемый тип конструктора копирования в абстрактном классе - C++
Здравствуйте! Есть абстрактный класс (с "чистыми" виртуальными функциями), и в нем необходимо явно определить конструктор копирования....

Создать массив в базовом абстрактном классе, и его передать функциям производных классов - C++
есть полностью абстрактный (виртуальный) класс. там все функции виртуальные и равны 0. Назовем его class A есть 3 производных ОТ НЕГО...

Двумерный динамический массив в классе. Зависание при вводе и вызове деструктора - C++
Объект класса содержит двумерный массив строк фиксированного размера(80) и длины n. При обращении к ф-ции ввода программа зависает и...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Trwsdf
Заблокирован
12.08.2014, 23:17 #16
Омг... я должен на все это отвечать ?
Цитата Сообщение от Antonioni Посмотреть сообщение
Действительно, только при виртульном диструкторе объект удаляется полностью.
В защиту Trwsdf скажу, что VS 2013 отсутствие виртуального диструктора за ошибку не считает, по этому нужно быть предельно внимательным!
Был бы смысл доказывать, если бы оппонент был и правда компетентным человеком.

Добавлено через 18 минут
еще раз прочитал тему, и понял несостоятельность критики в мой адрес.
А именно - да, в документации написано, что результат не определен.
Стало быть, реализация GNU (например) выдаст ошибку, а реализация от Microsoft просто сделает утечку памяти ( о чем я и писал в первом ответе ).
Ведь результат не определен, - каждая реализация вправе его выдавать по своему.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
12.08.2014, 23:37 #17
Цитата Сообщение от Antonioni Посмотреть сообщение
В защиту Trwsdf скажу, что VS 2013 отсутствие виртуального диструктора за ошибку не считает, по этому нужно быть предельно внимательным!
есть много что не считается за ошибку
например
C++
1
if(a=b)
и отсутствие виртуального деструкторатоже не всегда ошибка
например
у наследников переопределены только методы, новых членов, а тем паче указателей нет
и тогда главный деструктор вполне справится
так что это ошибка не синтаксинечкая, кои компилятор должен отлавливать, а лгоритмическая, проектирования
за этим человек должен следить
Trwsdf
Заблокирован
13.08.2014, 01:01 #18
Цитата Сообщение от ValeryS Посмотреть сообщение
есть много что не считается за ошибку
например
Код C++
1
if(a=b)
и отсутствие виртуального деструкторатоже не всегда ошибка
например
у наследников переопределены только методы, новых членов, а тем паче указателей нет
и тогда главный деструктор вполне справится
так что это ошибка не синтаксинечкая, кои компилятор должен отлавливать, а лгоритмическая, проектирования
за этим человек должен следить
Вы не правы в обоих случаях.
при a=b нет никакой ошибки оттого, что он присваивает a число b, после чего значение a неявно приводит к bool.

Насчет деструктора (поздравляю, вы все же осилили этот материал), всегда надо страховаться и писать его, ибо потом кто то сломает голову пытаясь найти ошибку, при поддержке кода, исключение составляют классы объявленные с ключевым словом final. Ито в том случае, если компилятор не выдает ошибки. В этой ситуации, каждый компилятор ведет себя по своему.
Хотел также заметить, что очень долго вы разбирались, видимо дается с трудом.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
13.08.2014, 01:33 #19
Цитата Сообщение от Trwsdf Посмотреть сообщение
при a=b нет никакой ошибки оттого, что он присваивает a число b, после чего значение a неявно приводит к bool.
спасибо что просвятил
Цитата Сообщение от Trwsdf Посмотреть сообщение
Насчет деструктора (поздравляю, вы все же осилили этот материал), всегда надо страховаться и писать его,
мы этот материал осилили лет так двадцать назад, причем на живых примерах а не зачитываясь талмудами и не ссылались на них ка на истину в последней инстанции
За сим разрешите откланяться, превращать нормальную тему в пипискометр нет никакого желания
Мои знания достаточно объективно оценивают работодатели
ct0r
Игогошка!
1769 / 671 / 42
Регистрация: 19.08.2012
Сообщений: 1,284
Завершенные тесты: 1
13.08.2014, 01:52 #20
Цитата Сообщение от Trwsdf Посмотреть сообщение
Еще бы, я сказал,что компилятор не выдаст ошибки и будет утечка памяти, а он на самом деле выдает ошибку.
Компилятор и не выдает никакой ошибки. Это же runtime-ошибка, а не compile-time.
Цитата Сообщение от Trwsdf Посмотреть сообщение
еще раз прочитал тему, и понял несостоятельность критики в мой адрес.
А именно - да, в документации написано, что результат не определен.
Стало быть, реализация GNU (например) выдаст ошибку, а реализация от Microsoft просто сделает утечку памяти ( о чем я и писал в первом ответе ).
Ведь результат не определен, - каждая реализация вправе его выдавать по своему.
Ты неправильно понимаешь термин undefined behavior. Там поведение зависит не только от особенностей реализации компилятора и его опций, но и от состояния памяти в данный момент времени. То есть можно легко получать разные ошибки на разных системах, несмотря на то, что программа собиралась каким-то конкретным компилятором и она одна. Ты же говоришь не про undefined behavior, а про implementation-defined или unspecified behavior. Но в данном случае имеет место именно undefined behavior, а его допущение - грубая ошибка разработчика.
Trwsdf
Заблокирован
13.08.2014, 10:49 #21
Цитата Сообщение от ct0r Посмотреть сообщение
Компилятор и не выдает никакой ошибки. Это же runtime-ошибка, а не compile-time.
Цитата Сообщение от ct0r Посмотреть сообщение
Ты неправильно понимаешь термин undefined behavior. Там поведение зависит не только от особенностей реализации компилятора и его опций, но и от состояния памяти в данный момент времени. То есть можно легко получать разные ошибки на разных системах, несмотря на то, что программа собиралась каким-то конкретным компилятором и она одна. Ты же говоришь не про undefined behavior, а про implementation-defined или unspecified behavior. Но в данном случае имеет место именно undefined behavior, а его допущение - грубая ошибка разработчика.
Речь идет о том, что компилятор не знает истинного размера объекта для его удаления, а стало быть просто ставит размер базового класса, при удалении. Однако, если размер потомка больше, чем размер базового класса, мы либо получим ошибку времени выполнения, либо утечку памяти ( о которой я и писал в первом посте темы, за что меня и начали унижать). Причем, результат не определен и да, как я и говорил, каждый компилятор волен действовать здесь по своему.
Насчет implementation-defined , я не мог так считать, ибо в таком случае мы бы получили правильную и работоспособную программу, где я говорил, что при сбое или утечке памяти все нормально хорошо? Ваши фантазии держите при себе.

Изначально меня ввели в заблуждение ошибочные ответы т.н. "экспертов", а именно, что компилятор, прежде чем запускать приложение, выдает ошибку, в тот момент не было времени на проверку. После, проверив эту информацию, я понял, всю несостоятельность критики в мой адрес, а также убедился в очередной раз в некомпететнтости и глупости "знающих людей" этого форума.
Voivoid
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
13.08.2014, 10:57 #22
Цитата Сообщение от Trwsdf Посмотреть сообщение
Речь идет о том, что компилятор не знает истинного размера объекта для его удаления, а стало быть просто ставит размер базового класса, при удалении
Э-э-э, опять фантазии уровня строгих указателей, размер тут совершенно ни при чем. Уважаемый "эксперт", сами разберетесь где заблуждаетесь или разжевать?
Trwsdf
Заблокирован
13.08.2014, 11:17 #23
Цитата Сообщение от Voivoid Посмотреть сообщение
Э-э-э, опять фантазии уровня строгих указателей, размер тут совершенно ни при чем. Уважаемый "эксперт", сами разберетесь где заблуждаетесь или разжевать?
ок, тогда и Страуструп в своей книге "Страуструп Б. Язык Программирования С++ - 2011" на стр. 510 пишет черт знает о чем. Согласен мы с ним оба "фантазеры" перед "папками" сидящими здесь.

Добавлено через 9 минут
насчет строгих указателей, советую вам наконецто то разобраться с ними. Что такое int*a и что такое int* a[10], чтобы меньше позориться.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
13.08.2014, 11:17 #24
Trwsdf, ты пишешь бред. Хотя бы сам возьми и проверь свою "гипотезу". Покажи, как деструктор вообще может влиять на утечки памяти??? Деструктор вызывается в коде, который проводит деаллокацию объекта, при этом сам ничего о деаллокации знать не может. Ему всё равно, объект в куче или на стеке и.т.д.
Trwsdf
Заблокирован
13.08.2014, 11:32 #25
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Trwsdf, ты пишешь бред. Хотя бы сам возьми и проверь свою "гипотезу". Покажи, как деструктор вообще может влиять на утечки памяти??? Деструктор вызывается в коде, который проводит деаллокацию объекта, при этом сам ничего о деаллокации знать не может. Ему всё равно, объект в куче или на стеке и.т.д.
Омг ))). Ну ок все дураки и я и Страуструп, один ты умный.
Сиди дальше тут и крути коровам хвосты на этом форуме "самый умный", а мне некогда, мне надо работать.

Информация для остальных администраторов форума приписавших себе титул "экспертов" с++ , можете лить грязь в догонку сколько хотите, я же себя уважаю, и сдержал слово, насчет ухода отсюда.
Voivoid
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
13.08.2014, 11:34 #26
Цитата Сообщение от Trwsdf Посмотреть сообщение
Страуструп в своей книге "Страуструп Б. Язык Программирования С++ - 2011" на стр. 510 пишет черт знает о чем
У меня этой книги нет под рукой. Если приведешь цитату - я тебе объясню что там имеется в виду.

Не по теме:

Цитата Сообщение от Trwsdf Посмотреть сообщение
насчет строгих указателей, советую вам наконецто то разобраться с ними. Что такое int*a и что такое int* a[10], чтобы меньше позориться.
Ты в той теме лучше что-нибудь ответь

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2014, 11:34
Привет! Вот еще темы с ответами:

Почему при переопределении виртуального метода в производном классе выводится метод базового? - C++
Всем добра! Помогите разобраться почему при переопределении виртуального метода в производном классе выводится метод базового ? По идеи...

Объявление переменных в классе - C++
#pragma once class streetdb { public: streetdb(void); ~streetdb(void); int admiral_1_137; private: };

Объявление операторов в классе - C++
Всем привет, объясните простым языком, когда используется ссылка(&) и когда не используется. Вот например: Fraction& operator += (const...

Объявление вектора в классе - C++
Здравствуйте! объявляю структуру в h файле: struct Admin { char login_admin; char pass_admin; }; class Nev_potok_blok { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.08.2014, 11:34
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru