Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.10.2015, 12:55   #21
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Фактически да, из-за виртуальности. virtual предоставляет возможность позднего связывания, поэтому компилятор для вызова данной функции построит код подобный "хей, пройди по указателю, там есть в таком-то месту указатель на таблицу виртуальных функций, возьми из таблицы указатель на функцию и вот её уже вызываем".
Croessmah вне форума Ответить с цитированием
Старый 01.10.2015, 12:57   #22
Gekan
Пользователь
 
Регистрация: 29.06.2012
Сообщений: 39
По умолчанию

Если убрать слово virtual, то результат изменится, так что можно предположить, что дело в виртуальности.
Gekan вне форума Ответить с цитированием
Старый 01.10.2015, 13:42   #23
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Нет. Это происходит потому что
УКАЗАТЕЛЬ зис в теле func_3() имеет тип А .

но компилятор знает что этот метод вызвал обьект типа С.

за счет слова виртуал выбирается метод класса С (при наличии).

если слово виртуал убрать - то вызовется метод класса А так как зис имеет тип А

___________________________________ _____

походу все это равносильно этому

Код:
class A 
{
public:
	virtual void func_1() {cout<<")))))))))))))))))))"<<endl; }
};
class B : public A
{
public:
	virtual void func_1() {cout<<"((((((((((("<<endl;}
};

void func_3(A &b) 
{b.func_1();}

int main()
{
	B b;
	func_3(b);
	return 0;
}
в функции void func_3(A &b) обьект b имеет тип А , но фактически был передан тип B

___________________________________ _

кстати созрел такой вопрос .

на сколько я знаю ставить virtual в производном классе не обязательно.

а если поставить , то на это будут потрачены ресурсы памяти ?

Последний раз редактировалось RAFA91; 01.10.2015 в 14:00.
RAFA91 вне форума Ответить с цитированием
Старый 01.10.2015, 22:18   #24
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
а если поставить , то на это будут потрачены ресурсы памяти ?
Смотря что и как понаписать...
Посоветую Вам, для начала, разобраться в банальных вопросах и только потом лезть в дебри. При знании основ в дебрях будет и так всё понятно.
Croessmah вне форума Ответить с цитированием
Старый 02.10.2015, 12:17   #25
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Смотря что и как понаписать...
если слово виртуал поставить возле функции производного класса , то

это затратит ресурсы памяти ?
RAFA91 вне форума Ответить с цитированием
Старый 02.10.2015, 13:01   #26
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от RAFA91 Посмотреть сообщение
если слово виртуал поставить возле функции производного класса , то

это затратит ресурсы памяти ?
зависит от того, что в базовом
Croessmah вне форума Ответить с цитированием
Старый 02.10.2015, 13:05   #27
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
зависит от того, что в базовом
понятное дело что тоже стоит слово виртуал. возле функции
RAFA91 вне форума Ответить с цитированием
Старый 02.10.2015, 17:56   #28
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Так как в базовом функция-член является виртуальной, то наличие ключевого слова virtual в наследнике ни на что не повлияет - что с ним, что без него, расходы будут одинаковы, собственно, как и поведение.
Цитата:
понятное дело что тоже стоит слово виртуал. возле функции
На самом деле ничего не понятно. Это всё обсуждение не понятно чего.
И что такое накладные расходы? virtual, например, может повлиять на читабельность (а это накладные расходы времени), а также, на размер исходника, ну и всё в таком духе.

Последний раз редактировалось Croessmah; 02.10.2015 в 20:03.
Croessmah вне форума Ответить с цитированием
Старый 02.10.2015, 21:51   #29
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

виртальность функций еще влияет на размер VMT и на способ вызова, но об этом волноваться нужно только в контроллерах, где памяти в обрез.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.10.2015, 22:15   #30
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
виртальность функций еще влияет на размер VMT и на способ вызова, но об этом волноваться нужно только в контроллерах, где памяти в обрез.
Не согласен. При частых вызовах, в приложениях, предполагающих высокое быстродействие (например, в играх), лишние уровни косвенности могут уже хорошо влиять, так что нужно думать, прежде чем везде виртуальность пихать.
Croessmah вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибки при компиляции с++ *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