|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
01.10.2015, 12:55 | #21 |
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
Фактически да, из-за виртуальности. virtual предоставляет возможность позднего связывания, поэтому компилятор для вызова данной функции построит код подобный "хей, пройди по указателю, там есть в таком-то месту указатель на таблицу виртуальных функций, возьми из таблицы указатель на функцию и вот её уже вызываем".
|
01.10.2015, 12:57 | #22 |
Пользователь
Регистрация: 29.06.2012
Сообщений: 39
|
Если убрать слово virtual, то результат изменится, так что можно предположить, что дело в виртуальности.
|
01.10.2015, 13:42 | #23 |
Заблокирован
Регистрация: 06.02.2011
Сообщений: 1,999
|
УКАЗАТЕЛЬ зис в теле func_3() имеет тип А .
но компилятор знает что этот метод вызвал обьект типа С. за счет слова виртуал выбирается метод класса С (при наличии). если слово виртуал убрать - то вызовется метод класса А так как зис имеет тип А ___________________________________ _____ походу все это равносильно этому Код:
___________________________________ _ кстати созрел такой вопрос . на сколько я знаю ставить virtual в производном классе не обязательно. а если поставить , то на это будут потрачены ресурсы памяти ? Последний раз редактировалось RAFA91; 01.10.2015 в 14:00. |
01.10.2015, 22:18 | #24 | |
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
Цитата:
Посоветую Вам, для начала, разобраться в банальных вопросах и только потом лезть в дебри. При знании основ в дебрях будет и так всё понятно. |
|
02.10.2015, 12:17 | #25 |
Заблокирован
Регистрация: 06.02.2011
Сообщений: 1,999
|
|
02.10.2015, 13:01 | #26 |
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
|
02.10.2015, 13:05 | #27 |
Заблокирован
Регистрация: 06.02.2011
Сообщений: 1,999
|
|
02.10.2015, 17:56 | #28 | |
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
Так как в базовом функция-член является виртуальной, то наличие ключевого слова virtual в наследнике ни на что не повлияет - что с ним, что без него, расходы будут одинаковы, собственно, как и поведение.
Цитата:
И что такое накладные расходы? virtual, например, может повлиять на читабельность (а это накладные расходы времени), а также, на размер исходника, ну и всё в таком духе. Последний раз редактировалось Croessmah; 02.10.2015 в 20:03. |
|
02.10.2015, 21:51 | #29 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
виртальность функций еще влияет на размер VMT и на способ вызова, но об этом волноваться нужно только в контроллерах, где памяти в обрез.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
02.10.2015, 22:15 | #30 |
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
Не согласен. При частых вызовах, в приложениях, предполагающих высокое быстродействие (например, в играх), лишние уровни косвенности могут уже хорошо влиять, так что нужно думать, прежде чем везде виртуальность пихать.
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
ошибки при компиляции с++ | *Fantom* | Помощь студентам | 1 | 29.10.2013 08:37 |
Почему на Linux вирусов нету, а на Android есть? | Ale}{ander | Общие вопросы по программированию, компьютерный форум | 13 | 06.09.2013 20:00 |
Unity 3D почему в инспекторе нету FBXimporter | SevenXP | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 0 | 22.10.2012 21:18 |
ошибки компиляции | KOLANICH | Общие вопросы C/C++ | 0 | 25.02.2012 17:14 |
Ошибки после компиляции | Cakeinpanic | Общие вопросы C/C++ | 8 | 16.05.2009 14:48 |