|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
17.04.2011, 01:24 | #1 |
Регистрация: 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? |
17.04.2011, 01:30 | #2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
делаете виртуальный пустой(скорее всего) конструктор(в абстракном классе!)
потом просто delete и все вызовется верно(проверено, благо сам это и использую) Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
17.04.2011, 01:42 | #3 | |
Регистрация: 17.04.2011
Сообщений: 9
|
Цитата:
Если в абстрактном классе А сделать конструктор (он есть и он не пустой) виртуальным, то компилятор ругается на это: "inline" является единственным допустимым классом хранения для конструкторов ... Если сделать чистый виртуальный деструктор в классе А, то его не удается реализовать в В по той же причине - компилятор не понимает, что делает чужой конструктор в классе В. |
|
17.04.2011, 01:58 | #4 |
Регистрация: 17.04.2011
Сообщений: 9
|
|
17.04.2011, 08:55 | #5 |
Форумчанин
Регистрация: 29.09.2010
Сообщений: 636
|
может таки виртуальный деструктор?
|
17.04.2011, 11:29 | #6 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
да деструктор, это я чего то попутал будучи сонным
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
как привязать вставленный объект к определенной ячейке без его подальшего по листу 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 18:10 |