0 / 0 / 0
Регистрация: 17.04.2011
Сообщений: 5
|
||||||||||||||||||||||||||||||||
1 | ||||||||||||||||||||||||||||||||
Как удалить объект по указателю на базовый класс?17.04.2011, 01:10. Показов 5427. Ответов 13
Метки нет (Все метки)
Допустим есть несколько классов:
// абстрактный класс - введен для управления наследниками
Это нужно, чтобы удалять объекты из массива _array_of_A "универсальным способом". Можно, конечно, ввести в класс А переменную Type и удалять по условию:
0
|
17.04.2011, 01:10 | |
Ответы с готовыми решениями:
13
Как удалить объект класс из кучи по указателю? Как удалить базовый объект? По указателю на базовый класс сделать копию объекта Указателю на базовый класс присвоить адрес производного класса |
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
17.04.2011, 01:26 | 2 |
AndreyBS, Э. А что мешает при нормальном деструкторе просто удалять не парясь с приведениями типов и т.п.? оО
0
|
0 / 0 / 0
Регистрация: 17.04.2011
Сообщений: 5
|
|
17.04.2011, 01:31 [ТС] | 3 |
Если не приводить типы, то операция delete _array_of_A[n] вызовет ошибку в памяти. Без приведения типов никак. Сначала должен сработать деструктор В, а уже потом деструктор А. Поэтому удаляя объект, к нему нельзя обращаться, как к А, ведь А не знает о деструкторе В и попросту игнорирует его. Думаю, от сюда и ошибка высвобождения памяти выскакивает.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
17.04.2011, 01:36 | 4 |
Это вряд ли, ведь указатель суть адрес; как по адресу определить тип переменной ну или объекта, которая там находится? Вряд ли. Извините, если что не так.
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
||||||
17.04.2011, 01:48 | 5 | |||||
виртуальный деструктор же
зачем кстати virtual public? Добавлено через 2 минуты легко, так же как вызываются виртуальные методы для полиморфных классов работает приведения dynamic_cast<> Добавлено через 8 минут
2
|
0 / 0 / 0
Регистрация: 17.04.2011
Сообщений: 5
|
|
17.04.2011, 01:50 [ТС] | 6 |
Планировал из классов В и С сделать надстройку типа
class E: public B, public C На сколько я понимаю, в таком случае в класс E войдет только один экземпляр класса А, т.к. он подключался через virtual public По поводу деструктора не получилось. Компилятор ругается. Можно пример? я тоже думаю, что где то в структуре памяти объекта хранится ИД класса. его просто нужно вытащить.
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
17.04.2011, 01:52 | 7 |
0
|
0 / 0 / 0
Регистрация: 17.04.2011
Сообщений: 5
|
|
17.04.2011, 01:58 [ТС] | 8 |
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|||||||||||||||||||||
06.05.2011, 23:00 | 9 | ||||||||||||||||||||
У меня возник один вопрос, вот в книге я прочёл:
"В создании и уничтожении объектов имеется одно существенное отличие. Создавая объект, мы всегда точно знаем, какому классу он принадлежит. При уничтожении это не всегда известно.
А в этой теме мы наблюдаем, что для удаления производного класса НЕОБЯЗАТЕЛЬНО наличие виртуального деструктора. Конкретнее, здесь: (сообщение N 5)
Добавлено через 44 секунды Ещё в книге написано: "Для того чтобы все необходимые деструкторы были вызваны, нужно воспользоваться виртуальным механизмом – объявить деструктор как в базовом классе, так и в производном, как virtual. "
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
06.05.2011, 23:06 | 10 |
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|||||||||||
06.05.2011, 23:20 | 11 | ||||||||||
А он именно что вызван в данном коде, вот я упростил код:
И вывод:
Добавлено через 23 секунды хотя он НЕ ВИРТУАЛЬНЫЙ!
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
07.05.2011, 00:01 | 12 |
для виртуальности метода достаточно указать его виртуальность в базовом классе, и не открывать потом америку
так что виртуальный он, виртуальный
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
07.05.2011, 00:26 | 13 |
alex_x_x, согласен, достаточно, однако я всегда указываю virtual перед виртуальными методами во всех классах - мне так удобнее.
Не по теме: Хотя, возможно, вырвал из контекста, всю тему не читал)))
0
|
07.05.2011, 09:05 | 14 |
Сие звучит, возможно, не совсем понятно. Смысл в том, что когда в базовом классе мы объявляем метод или деструктор с ключом virtual, то во всех производных классах virtual пронаследуется из базового независимо от того, напишем мы в производном классе ключ virtual, или нет. В производных классах в таких случаях обычно всё равно пишут ключ virtual - исключительно ради удобства чтения кода
0
|
07.05.2011, 09:05 | |
07.05.2011, 09:05 | |
Помогаю со студенческими работами здесь
14
Создание объекта произвольного класса по указателю на базовый класс Присвоение указателю на базовый класс адреса производного класса typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения Как вернуть объект по указателю Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |