![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Paspartu |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 3.5.2007 Репутация: нет Всего: нет |
Доброго времени суток.
Вот такой вопрос: 23. Что будет напечатано в результате?
Ответ: c) classB classA Как правильно обосновать ответ? пробую так: т.к. функция msg () является виртуальной в базовом классе A и она переопределена в производном классе B, унаследованном от класса A, то решение о том, какая ее версия будет вызвана определяется по типу объекта… т.к. указатель на базовый класс можно использовать для ссылки на объекты любых других классов, выведенных из базового то A * pointer = new B, var – указывает на объект класса B, соответственно pointer->msg() приведет к вызову версии msg () для класса B. При вызове f(*pointer) в функции void f(A cl) будет времмено создан объект класса A и соответственно class.msg() приведет к вызову msg () для класса A. Что Вы думаете по этому поводу? |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
многабукафф. в первом случае будет выведен classB, по принципу полиморфности. Во втором classA т.к обьект передаеться по значению, значит он будет обрезан до родителя |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
compile time error в строчке Добавлено через 26 секунд даже подсветка хворума показывает что этот код крив. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
по смыслу название переменной "class" тоже неправильно: как параметр передается объект, а не класс... ;) |
|||
|
||||
| Paspartu |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 3.5.2007 Репутация: нет Всего: нет |
с class я конечно загнул, аш самому смешно
в попыхах писал, код кривой, но важна суть... с принципом полиморфности согласен, а чем обосновать ответ < Во втором classA т.к обьект передаеться по значению, значит он будет обрезан до родителя >? Стандарт? |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
стандарт я не читал ниразу |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Очень просто, при полиморфном вызове используется указатель на VMT, который устанавливается конструктором. Т.е надо "посмотреть" чьим конструктором создан объект и станет ясно , какой метод вызовется.
Это сообщение отредактировал(а) mes - 21.9.2008, 21:23 |
||||
|
|||||
| Paspartu |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 3.5.2007 Репутация: нет Всего: нет |
Так, понятно, огромное спасибо!
Вот еще вопрос дано: char* str = "12345"; и усе! перевернуть все символы не используя буфер т.е. получить я так понял указатель на "54321", по google - л, но хочется понять принцип, и как зная только лишь указатель это можно сделать? |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
Paspartu,
никак в такой формулировке -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Paspartu |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 3.5.2007 Репутация: нет Всего: нет |
Вот и я голову ломаю, с массивом все понятно, а так через указатель?
В любом случае нужен буфер, хотя в задании четко прописано - дополнительный буфер не использовать!? Во засада! |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
Paspartu, при такой записи вероятно, что нельзя будет сделать, т.к очень часто это воспринимается компилятором как const char* |
|||
|
||||
| Rpahut |
|
||||
![]() 0xdeadbeef ![]() Профиль Группа: Участник Сообщений: 243 Регистрация: 9.4.2006 Репутация: 2 Всего: 7 |
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею? |
||||
|
|||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
стандарт тут не при чем данный эффект называется slicing происходит это из-за того, что стандартные конструкторы - в том числе и копиконструктор - не могут быть виртуальными. Т.о. для создания временного объекта вызывается копиконструктор целевого класса Это сообщение отредактировал(а) J0ker - 22.9.2008, 04:03 |
|||
|
||||
| J0ker |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
как написал vinter это либо не будет компилиться, либо приведет к undefined behavior т.к. по стандарту строковые литералы - константы (2.3.14) |
||||||
|
|||||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 0 Всего: 52 |
С указателем никак, а если через буффер, то ещё можно так:
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
||||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 0 Всего: 52 |
Кто больше?
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
нет у кого длиннее |
|||
|
||||
| Torsten |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 10.6.2008 Где: Pskov Репутация: 3 Всего: 7 |
хм ... в каком то из недавних номеров журнала хакер (летнем) КК показыавл как это сделать. Но реально непонятному кому это нужно, если коде используются такие нестадартные механизмы - я не завидую тому кто будет такой код разбирать и дописывать. Хотя бы потому что это задача легко решается если проходить от конца строки к началу - всего лишь алгоритм. Это сообщение отредактировал(а) Torsten - 22.9.2008, 12:27 --------------------
We have no begining, we have no end. We are infinite. |
|||
|
||||
| UnrealMan |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Тут undefined behavior. |
||||
|
|||||
| J0ker |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
в каком месте? |
||||||
|
|||||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Между двумя соседними точками следования нельзя дважды модифицировать один и тот же скалярный объект.
Это сообщение отредактировал(а) UnrealMan - 23.9.2008, 14:08 |
|||
|
||||
| J0ker |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
здесь нет соседних точек:
так что всё тип-топ Это сообщение отредактировал(а) J0ker - 23.9.2008, 18:16 |
||||
|
|||||
| UnrealMan |
|
||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Ну, тут-то их конечно нет, т.к. такая программа некорректна Что касается предыдущего твоего примера, то там две соседние точки следования обязательно будут. Первая точка следования будет либо такой:
либо такой:
Следующая точка следования будет согласно абзацу 1.9/16. Функция, о которой идёт речь при упоминании случая с 1.9/17, - это та, что содержит expression-statement, коим является твой кусок кода.
То есть хреново |
||||||||||||
|
|||||||||||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
изучаю вопрос
Это сообщение отредактировал(а) J0ker - 24.9.2008, 05:37 |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
да, согласен, был неправ (5/4)
плюсик вам
программа корректна - эквивалентность некорректна - прояснилось из 5/2 Однако хочу уточнить - согласно тому-же 5/2 - при перегруженном операторе ^= undefined behavior исчезает. Я правильно понимаю? UPD упс, не могу поставить плюсик. Обязательно поставлю когда наберу 100 постов Это сообщение отредактировал(а) J0ker - 24.9.2008, 07:13 |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
||||
|
||||
| UnrealMan |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Напомню, что в теме речь шла про массивы char-ов, а с char-ами такая бодяга не пройдёт.
Перегрузка оператора заключается в определении функции с именем operator operator, где хотя бы один параметр (явный или неявный) имеет пользовательский тип или тип, представляющий собой ссылку на пользовательский тип. На такую функцию, как и на все другие, распространяется правило
Это сообщение отредактировал(а) UnrealMan - 24.9.2008, 13:04 |
||||
|
|||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
именно это и ввело меня в заблуждение - считал операторы простых типов полностью эквивалентными по реализации операторам классов (за исключением операторов || и &&). Естественно я понимаю что .operator op к простым типам не применим синтаксически. спасибо |
|||
|
||||
| Maka6er |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 27.2.2007 Где: Киев Репутация: нет Всего: 3 |
И я нас... сделаю свой вклад
|
|||
|
||||
| Annihilator |
|
||||
![]() bytegrinder ![]() ![]() Профиль Группа: Участник Сообщений: 493 Регистрация: 21.11.2006 Где: Омск Репутация: 1 Всего: 3 |
а где память под start выделяешь??? Без буфера - никак
а про strrev(char* s) все дружно забыли. Но опять же без буфера никуда Это сообщение отредактировал(а) Annihilator - 24.9.2008, 19:55 -------------------- Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
посмотрите внимательнее код - память для start не нужна - он используется как указатель на основную строку, равноправный указателю str, под который тоже память нигде не выделялась ) а технология используется следующая :
как видете ни одного стороннего байта не используются. Такое возможно благодаря некоторому свойству оператора XOR. |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
ну это все равно не рабочий вариант, считай у нас дано const char *
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| Maka6er |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 27.2.2007 Где: Киев Репутация: нет Всего: 3 |
А разве обязательно под указатель выделять память? Указатель должен указывать на область в памяти. Я устанавливаю один указатель на начало строки, один - на конец.
const char * - это указатель на строковую константу (строковый литерал), а константу изменить нельзя. Это сообщение отредактировал(а) Maka6er - 25.9.2008, 12:24 |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
А vinter что имел ввиду? -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| Maka6er |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 27.2.2007 Где: Киев Репутация: нет Всего: 3 |
||||
|
||||
| serg76 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 19.3.2008 Репутация: нет Всего: нет |
даже не выделяя переменную для цикла зы полный бред имхо тож самое что бутерброды делать топором |
|||
|
||||
| J0ker |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
ты бы почитал сначала обсуждение этот код в большинстве случаев приведет к Segmentation fault и Access violation |
||||
|
|||||
| serg76 |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 19.3.2008 Репутация: нет Всего: нет |
а где приведет то, конкретнее? зы насчет const наскока помню в С через указатели можно все менять для примера к коду выше заменить
на
|
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
При таком подходе Вы надеетесь, что даные размещенные по указателю str1, размещаются в пользовательской области с правом записи. Однако строчка : говорит компилятору о возможности размещении данных в памяти только для чтения. Как видите результат выполнения операций в таком случае потенциально опасен и зависит от компилятора и его настроек. |
|||
|
||||
| J0ker |
|
||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
здесь:
строковые литералы явяются константами и могут размещаться в защищенном от записи сегменте возможность присвоения их не константам - тяжелое наследие прошлого Добавлено @ 19:07 объявление типа
размещает массив на стеке - что позволяет менять его содержимое Добавлено @ 19:17
это говорит компилятору, что str константный массив. Но размещение его будет на стеке (потому, что это массив - он просто с инициализатором) выражение:
говорит о том, что str указатель на константную строку, инициализируемый АДРЕСОМ строкового литерала, который возможно находится в защищенном от записи сегменте как грится "почувствуйте разницу" Это сообщение отредактировал(а) J0ker - 27.9.2008, 19:17 |
||||||||||
|
|||||||||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
Ну это смотря где его объявить. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| J0ker |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
да в функции иначе в секции .rdata (защищенные от записи и исполнения инициализированные данные) и .data (защищенные от исполнения инициализированные данные) соответственно хотя рояля это и не играет Это сообщение отредактировал(а) J0ker - 28.9.2008, 06:56 |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |