Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.06.2010, 06:47   #11
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

OK. Благодарю за информацию!
Oleg_SK вне форума Ответить с цитированием
Старый 15.06.2010, 09:44   #12
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Если класс абстрактный, то либо это сферический класс в вакууме и тогда пользы от него вообще никакой, либо у него будут наследники. Если у класса есть наследники, ему необходим виртуальный деструктор.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 15.06.2010, 10:28   #13
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

Гром
Точнее будет сказать, что виртуальный деструктор нужен базовому классу (т.е. классу имеющему классы-наследники) содержащему хотя бы один виртуальный метод; AFAIK базовому классу не имеющему виртуальных методов виртуальный деструктор нужен как собаке пятая нога. Все это в общем-то понятно... Вопрос был в другом: мне не понятно, почему разработчики C++ не сделали так, чтобы деструктор класса объявлялся виртуальным автоматически при появлении в этом классе хотя-бы одного виртуального метода? Я решил что может быть чего-то не понимаю, и по этому попросил привести примеры случаев в которых может потребоваться оставить деструктор класса не виртуальным при наличии в этом классе виртуальных методов. Carbon на вскидку привел парочку таких примеров Если вы приведете свои примеры буду благодарен...
Oleg_SK вне форума Ответить с цитированием
Старый 15.06.2010, 10:39   #14
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Наличие виртуального деструктора никак не связано с наличием виртуальных методов.
Код:
class A // Базовый класс. Для простоты оставим пустым, т.к. это ничего не меняет в данном случае
{
public:
  ~A() {}; // Не обязательно писать. Этот же код сгенерируется компилятором автоматически
}

class B: public A
{
private:
  int *array;
public:
  B()
  {
    array = new int[100];
  }
  ~B()
  {
    delete[] array;
  }
}

int main()
{
  A *a = new B();
  B *b = new B();

  delete a; // тут будет утечка памяти, т.к. деструктор B не вызовется
  delete b; // тут всё нормально будет
}
Если бы деструктор A был виртуальным, тогда бы в строке delete a утечки не произошло.
Деструкторы должны быть виртуальными всегда, когда предполагается наличие наследников у класса.
pu4koff вне форума Ответить с цитированием
Старый 15.06.2010, 18:36   #15
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

pu4koff
Простите нуба, но я что-то торможу: для чего может понадобиться обращаться к объекту класса-потомка не имеющему виртуальных функций (не считая виртуального деструктора) через указатель на объект класса-родителя? Я просто не вижу в этом смысла; с объектом на который указывает данный указатель ничего нельзя сделать кроме как корректно удалить (учитывая виртуальный деструктор)... Как я понимаю, такой указатель применяемый совместно с виртуальными функциями нужен для реализации полиморфизма, которого в данном примере (за исключением деструктора) не наблюдается... Можно конечно использовать такой указатель для последующего приведения его к типу объекта на который он указывает с помощью dinamic_cast, но тогда все равно не понятно: зачем городить огород с удалением объекта через такой указатель, если его можно удалить после приведения типа указателя к типу объекта.

Последний раз редактировалось Oleg_SK; 15.06.2010 в 18:43.
Oleg_SK вне форума Ответить с цитированием
Старый 15.06.2010, 19:21   #16
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

На правах кэпа скажу:

Стандарт позволяет приводить указатель на объект производного класса к указателю на объект базового. Надеюсь тут вопросов нет? Просто следите за мыслью. Стандарт не гарантирует, что каждая строчка кода будет осмысленной. Поэтому мне вдруг может прийти в голову ради прикола сделать A * obj = new B(); причём невозбранно. А если стандарт позволяет подобное (т.е. есть потенциальная возможность, что такой код будет), то тот, кто пишет класс, должен быть готов к такому (защита от дурака и его дурацкой утечки памяти).
Carbon вне форума Ответить с цитированием
Старый 15.06.2010, 20:38   #17
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

Понятно... Бдагодарю за разъяснение!
Oleg_SK вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C++] Указатель на производный класс в базовом Student_IT Общие вопросы C/C++ 3 06.06.2010 07:06
Как в базовом классе описать указатель на объект производного класса? MasterGH Общие вопросы C/C++ 3 16.11.2009 02:55
Классы(абстрактный и наследование) Пепел Феникса Общие вопросы C/C++ 6 02.11.2009 01:18
Наследование: абстрактный класс zak Общие вопросы C/C++ 4 22.12.2007 13:49