Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Ответ
 
Опции темы
Старый 17.04.2011, 01:24   #1
AndreyBS
 
Регистрация: 17.04.2011
Сообщений: 9
По умолчанию как удалить объект по указателю на его базовый класс?

Допустим есть несколько классов:

// абстрактный класс - введен для управления наследниками
class A{
...
}

// рабочий класс 1
class B: virtual public A{
...
}

// рабочий класс 2
class С: virtual public A{
...
}

// контейнер - управляет всеми рабочими классами через класс А
class D
A *_array_of_A[];
...
_array_of_A[0] = new B;
_array_of_A[1] = new C;
...
delete (B *)_array_of_A[0];
delete (C *)_array_of_A[1];
}

Вопрос: существует ли "универсальный метод" удаления объектов класса B или C, не зная тип класса, но имея указатель на их базовый класс А?

Это нужно, чтобы удалять объекты из массива _array_of_A "универсальным способом". Можно, конечно, ввести в класс А переменную Type и удалять по условию:
switch(_array_of_A[n]->Type){
case TypeA: delete (A *)_array_of_A[n]; break;
case TypeB: delete (B *)_array_of_A[n]; break;
}
Это не красиво. Может как-то еще это можно сделать? Можно как-то по указателю узнать реальный тип объекта (до как он создавался командой new) во время runtime?
AndreyBS вне форума Ответить с цитированием
Старый 17.04.2011, 01:30   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,002
По умолчанию

делаете виртуальный пустой(скорее всего) конструктор(в абстракном классе!)
потом просто delete и все вызовется верно(проверено, благо сам это и использую)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.04.2011, 01:42   #3
AndreyBS
 
Регистрация: 17.04.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
делаете виртуальный пустой(скорее всего) конструктор(в абстракном классе!)
потом просто delete и все вызовется верно(проверено, благо сам это и использую)
Не совсем понял. Именно конструктор, а не деструктор? Впрочем, попробовал и то и другое - не помогло.

Если в абстрактном классе А сделать конструктор (он есть и он не пустой) виртуальным, то компилятор ругается на это: "inline" является единственным допустимым классом хранения для конструкторов ...

Если сделать чистый виртуальный деструктор в классе А, то его не удается реализовать в В по той же причине - компилятор не понимает, что делает чужой конструктор в классе В.
AndreyBS вне форума Ответить с цитированием
Старый 17.04.2011, 01:58   #4
AndreyBS
 
Регистрация: 17.04.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
делаете виртуальный пустой(скорее всего) конструктор(в абстракном классе!)
потом просто delete и все вызовется верно(проверено, благо сам это и использую)
После пары экспериментов все получилось. Спасибо!
Не знал, что виртуальный деструктор так сработает.
AndreyBS вне форума Ответить с цитированием
Старый 17.04.2011, 08:55   #5
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

может таки виртуальный деструктор?
onewho вне форума Ответить с цитированием
Старый 17.04.2011, 11:29   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,002
По умолчанию

да деструктор, это я чего то попутал будучи сонным
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как привязать вставленный объект к определенной ячейке без его подальшего по листу Excel 2003? Rybit Microsoft Office Excel 0 02.04.2011 14:09
результат базовый класс и наследование Пепел Феникса Общие вопросы C/C++ 1 21.09.2010 02:29
Создать базовый класс sT1mfy Общие вопросы Delphi 3 11.06.2010 21:38
Как создать в Дeлфи класс в DLL для использования его в VC++ Dmitriy.Ch Общие вопросы Delphi 0 25.07.2009 08:40
Вернут указатель на базовый класс Crucian Общие вопросы C/C++ 2 08.11.2007 19:10


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS