![]() |
|
Модераторы: 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 |
С указателем никак, а если через буффер, то ещё можно так:
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |