| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Редкая, но возможная грабля |
| Автор: FunnyFalcon 13.12.2006, 15:55 | ||||
g++ 3.4.6, 4.0.x Это известная фича? А как в других компиляторах? |
| Автор: Sartorius 13.12.2006, 16:02 |
| А ты попробуй dynamic_cast-ом B в delete преобразовать... Останется еггог? |
| Автор: FunnyFalcon 13.12.2006, 16:59 |
| dinamic_cast может и сработает. Но допустим, мы не знаем, на объект какого класса a на самом деле ссылается? (А иначе зачем нам наследование?) |
| Автор: Fazil6 13.12.2006, 18:25 | ||
| а в чем собственно фича? по моему все правильно, как и должно было быть Добавлено @ 18:27 добавь в A
и ексепшена не будет |
| Автор: Daevaorn 13.12.2006, 18:58 |
Это известная ошибка начинающих разработчиков на C++ |
| Автор: Sartorius 13.12.2006, 19:05 |
| Daevaorn, точна |
| Автор: FunnyFalcon 14.12.2006, 14:02 |
| Проблема в том, что вообще ничего виртуального нет в классе A. И поэтому не выделяется указатель на виртуальную таблицу. А когда наследуем и создаём виртуальный метод, то указатель на вирт.таблицу добавляется в начало. Для чего я и распечатывал значения указателей - они разные, и именно поэтому и выскакивает ошибка - я пытаюсь удалить по неправильной ссылке. Первый вопрос у меня возник по-этому поводу - ну почему указатель выртуальной таблицы добавляется в начало? добавься он после A.i, ошибки не было бы. Вот я и спрашиваю - все компиляторы в данной ситуации ведут себя так же? Идея была использовать не чистый С++, реализовать альтернативу виртуальной таблице. Но найдется программер, который отнаследует и приляпает виртуальный метод. И что? Тут же всё пойдёт насмарку? Потому-что компилятор, видите ли, любит, чтобы таблица всегда была сначала? Се ля ви (такова жизнь). Это не наезд. Я действительно новичок в С++. Просто есть вещи, не до конца подчиняющиеся (моей) логике. |
| Автор: Romikgy 14.12.2006, 15:01 | ||
| имхо некоректный код воть немного подправил для наглядности
посмотри что выдает! |
| Автор: FunnyFalcon 14.12.2006, 18:53 | ||
gcc 3.4.6. А у тебя какой компилятор? |
| Автор: Romikgy 14.12.2006, 19:06 | ||
gcc 3.4.2 (только под винду)
FunnyFalcon, так ты видишь в чем ошибка? |
| Автор: Fazil6 14.12.2006, 21:57 | ||
и в чем же? о какой ошибке идет речь? |
| Автор: FunnyFalcon 15.12.2006, 09:32 | ||||||
По-моему это довольно весомая ошибка. Или я не прав? Программа скомпиленная вашим компилятором этой ошибки не выдаёт. Но вот это мне подсказывает, что в большой программе могут возникнуть большие трудности:
УКАЗАТЕЛИ РАЗНЫЕ!!!! И что тогда удалает delete? Какую память освобождает? |
| Автор: Romikgy 15.12.2006, 12:43 | ||||
вот на это и намекал! (неправильная работа с указателями) на это как то не обратил внимание хотя вроде объяснили PS правда не понятно , ведь это неявное преобразование указателей!!! в C++ Builder 6 такого преобразования нет , указатели одни и теже!
|
| Автор: FunnyFalcon 15.12.2006, 13:14 | ||||||||||
Значит C++Builder 6 в данном вопросе - наиболее логичный компилятор. А как будет выглядеть результат работы следующего кода:
На gcc-3.4.6 вышло:
Откуда видим, что указатель на в. таблицу приляпался к началу. Видимо на С++Builder-е будет что-то вроде
Пришлёшь результат? |
| Автор: Romikgy 15.12.2006, 14:29 | ||
|
| Автор: FunnyFalcon 15.12.2006, 14:53 |
| Ну что ж. Borland есть за что похвалить. А как у MS C++ дела обстоят? |
| Автор: _stranger_ 15.12.2006, 15:15 | ||
Visiual Studio 7.0
|
| Автор: FunnyFalcon 15.12.2006, 15:55 | ||||
Жаль. Самый верный способ отнаследовать от одного родителя, и дался в зубы только Borland-у. Очень жаль. |
| Автор: Fazil6 15.12.2006, 15:58 | ||
хоть там и нет эксепшена, но работает этот код по твоему алгоритму неправильно, так что еще неизвестно, что лучше, когда эксепшен вылетает или когда втихую пашет, но 100% неправильно. |