C++, виртуальный деструктор |
Здравствуйте, гость ( Вход | Регистрация )
C++, виртуальный деструктор |
Алексей1153 |
17.8.2010, 19:24
Сообщение
#21
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
нет, речь не про виртуальный деструктор, а про явный вызов виртуальных функций из деструктора предка
|
|
|
BRE |
17.8.2010, 19:27
Сообщение
#22
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Ты про чисто виртуальные функции или просто виртуальные?
|
|
|
Алексей1153 |
17.8.2010, 19:51
Сообщение
#23
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Щас сделаю тест, самому охота вспомнить )
хм, выяснилась интересная вещь. Ни Креатор, ни Студия (№6, №9) просто не позволяют так сделать ещё на уровне линковки
Цитата unresolved external symbol "public: virtual void __thiscall A::F(void)" (?F@A@@UAEXXZ) Цитата undefined reference to `A::F()' А ведь я помню, нарвался как то на подобное, но не могу вспомнить, как именно Сообщение отредактировал Алексей1153 - 17.8.2010, 19:54 |
|
|
Iron Bug |
17.8.2010, 20:21
Сообщение
#24
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
На сколько я помню, при удалении объекта с виртуальным деструктором, будет вызван деструктор из его vtbl. После его отработки, vtbl будет переключена на таблицу базового класса и будет вызван его деструктор и т.д. Даже если ты будешь удалять объект по указателю на его базовый класс. В этом и смысл. А вот с конструкторами такое не пройдет, они не могут быть виртуальными. Поэтому, в конструкторе будет вызван виртуальный метод того класса, конструктор которого в данный момент работает, даже если в производном классе он переопределен. абсолютно верно. именно так и будет. если в классе виртуальная функция определена, то она может быть вызвана в деструкторе этого класса и в деструкторах классов-наследников, если вдруг потребуется. для каждого класса могут использоваться его функции и функции прародителей. для деструктора нет ограничений. они есть только для конструктора - так как в момент создания элемента виртуальной таблицы и указателя this просто ещё нет. |
|
|
Litkevich Yuriy |
18.8.2010, 4:26
Сообщение
#25
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
... вызываются ли виртуальные функции в деструкторе (низя) нет, у меня именно пустой деструктор (мне нечего было подчищать при завершении работы класса), а насчёт того, что нельзя, я тоже краем уха где-то слышал.... производится ли где-то явное приведение типа с последующим изменением начала объекта вот это не понял, что значит с изменением начала объекта?
|
|
|
Алексей1153 |
18.8.2010, 6:50
Сообщение
#26
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
а насчёт того, что нельзя, я тоже краем уха где-то слышал. поскольку точно не могу факт привести, не буду придумывать Лучше всегда поставить эксперимент на месте и проверить в отладчике. вот это не понял, что значит с изменением начала объекта? например Раскрывающийся текст
Сообщение отредактировал Алексей1153 - 18.8.2010, 6:52 |
|
|
kwisp |
18.8.2010, 9:43
Сообщение
#27
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
хм, выяснилась интересная вещь. Ни Креатор, ни Студия (№6, №9) просто не позволяют так сделать ещё на уровне линковки ты в первом посте верно написал - при вызове виртуальных функций из деструктора - просто напросто вызовутся функции того класса чей деструктор а не предков. что стандарт по этому поводу говорит конечно интересно. а не линкуется, потому что получается вызов чисто виртуальной функции. Раскрывающийся текст
|
|
|
Алексей1153 |
18.8.2010, 10:11
Сообщение
#28
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
функции данного объекта, а не потомков kwisp, вообще-то, я про потомков говорил ) Ведь назначение виртуальных функций - вызывать методы потомков вызов чисто виртуальной функции. такой вызов не запрещён вроде Потому что абстрактный объект создать нельзя, а потомки должны обязательно переопределить виртуалки Сообщение отредактировал Алексей1153 - 18.8.2010, 10:13 |
|
|
kwisp |
18.8.2010, 11:16
Сообщение
#29
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
|
|
|
Алексей1153 |
18.8.2010, 12:20
Сообщение
#30
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
что тут верить то Проверить, и всё
Сообщение отредактировал Алексей1153 - 18.8.2010, 12:22 |
|
|
Текстовая версия | Сейчас: 27.11.2024, 18:37 |