![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
FunnyFalcon |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 27.3.2006 Репутация: нет Всего: 7 |
g++ 3.4.6, 4.0.x Это известная фича? А как в других компиляторах? |
||||
|
|||||
Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 8 Всего: 37 |
А ты попробуй dynamic_cast-ом B в delete преобразовать... Останется еггог?
|
|||
|
||||
FunnyFalcon |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 27.3.2006 Репутация: нет Всего: 7 |
dinamic_cast может и сработает.
Но допустим, мы не знаем, на объект какого класса a на самом деле ссылается? (А иначе зачем нам наследование?) |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
а в чем собственно фича?
по моему все правильно, как и должно было быть Добавлено @ 18:27 добавь в A
и ексепшена не будет |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 8 Всего: 37 |
Daevaorn, точна
![]() |
|||
|
||||
FunnyFalcon |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 27.3.2006 Репутация: нет Всего: 7 |
Проблема в том, что вообще ничего виртуального нет в классе A.
И поэтому не выделяется указатель на виртуальную таблицу. А когда наследуем и создаём виртуальный метод, то указатель на вирт.таблицу добавляется в начало. Для чего я и распечатывал значения указателей - они разные, и именно поэтому и выскакивает ошибка - я пытаюсь удалить по неправильной ссылке. Первый вопрос у меня возник по-этому поводу - ну почему указатель выртуальной таблицы добавляется в начало? добавься он после A.i, ошибки не было бы. Вот я и спрашиваю - все компиляторы в данной ситуации ведут себя так же? Идея была использовать не чистый С++, реализовать альтернативу виртуальной таблице. Но найдется программер, который отнаследует и приляпает виртуальный метод. И что? Тут же всё пойдёт насмарку? Потому-что компилятор, видите ли, любит, чтобы таблица всегда была сначала? Се ля ви (такова жизнь). Это не наезд. Я действительно новичок в С++. Просто есть вещи, не до конца подчиняющиеся (моей) логике. |
|||
|
||||
Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
имхо некоректный код
воть немного подправил для наглядности
посмотри что выдает! -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
|||
|
||||
FunnyFalcon |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 27.3.2006 Репутация: нет Всего: 7 |
gcc 3.4.6. А у тебя какой компилятор? |
|||
|
||||
Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
gcc 3.4.2 (только под винду)
FunnyFalcon, так ты видишь в чем ошибка? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
и в чем же? о какой ошибке идет речь? |
|||
|
||||
FunnyFalcon |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 27.3.2006 Репутация: нет Всего: 7 |
По-моему это довольно весомая ошибка. Или я не прав? Программа скомпиленная вашим компилятором этой ошибки не выдаёт. Но вот это мне подсказывает, что в большой программе могут возникнуть большие трудности:
УКАЗАТЕЛИ РАЗНЫЕ!!!! И что тогда удалает delete? Какую память освобождает? |
||||||
|
|||||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
любой компилер здесь должен вызывать ошибку. Я не врубаюсь на что намекает Romikgy и что он хочет своим примером показать.
значения указателей разные потому, что здесь компиллятор приводит из типа B* в А* и при удалении а он естественно вызывеет его деструктор так как а имеет тип А*, а фактически объект имеет тип В и должен быть вызван его деструктор и чтобы в такой ситуации вызывался правильный деструктор все деструкторы должны быть виртуальными, чтобы выбирался деструктор не по типу, а по фактическому объекту. |
|||
|
||||
Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
вот на это и намекал! (неправильная работа с указателями) на это как то не обратил внимание ![]() хотя вроде объяснили PS правда не понятно , ведь это неявное преобразование указателей!!! в C++ Builder 6 такого преобразования нет , указатели одни и теже!
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
|||
|
||||
FunnyFalcon |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 27.3.2006 Репутация: нет Всего: 7 |
Значит C++Builder 6 в данном вопросе - наиболее логичный компилятор. А как будет выглядеть результат работы следующего кода:
На gcc-3.4.6 вышло:
Откуда видим, что указатель на в. таблицу приляпался к началу. Видимо на С++Builder-е будет что-то вроде
Пришлёшь результат? |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |