Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > виртуальны функции: преимущества на практике


Автор: bomberman 14.11.2008, 13:22

Привет!

1) Однажды на собеседовании задали вопрос: покажите на примере (напишите С++ код) и объясните в чем 
    преимущества и (когда без них практически не обойтись) применения виртуальных функций.

2) Я знаю, что виртуальные функии применяются в технологии COM и при создании плагинов
    Можно объяснить в общем, для чего именно они там используются, что без них не обойтись

3) В каком источнике можно найти обоснование того, что указатель базового неполиморфного класса
    ссылаясь на объект полиморфного производного класса  не вызовет виртуальный метод производного
    класса, т.е. не выполнится динамическое связывание

Большое спасибо!  

Автор: Alek86 14.11.2008, 14:04
Цитата(bomberman @  14.11.2008,  13:22 Найти цитируемый пост)
 Можно объяснить в общем, для чего именно они там используются, что без них не обойтись

для бинарной совместимости dll и exe, к примеру
(вообще-то там использубтся не сами виртуальные функции, а то, что они хранятся в виде таблицы указателей на функции)

по сабжу - почитай в инете про полиморфизм
к примеру, http://www.rsdn.ru/Forum/message/2184147.1.aspx

Автор: J0ker 14.11.2008, 20:34
Цитата(Alek86 @  14.11.2008,  14:04 Найти цитируемый пост)
Цитата(bomberman @  14.11.2008)

 Можно объяснить в общем, для чего именно они там используются, что без них не обойтись


для бинарной совместимости dll и exe, к примеру
(вообще-то там использубтся не сами виртуальные функции, а то, что они хранятся в виде таблицы указателей на функции)

для бинарной совместимости применяют соглашения о вызове
в COM виртуализация применяется для работы с объектами посредством абстрактных интерфейсов

Автор: mes 14.11.2008, 21:56
Цитата(J0ker @  14.11.2008,  20:34 Найти цитируемый пост)
для бинарной совместимости применяют соглашения о вызов

Алек86 имел ввиду не сами виртуальные функции, а абстрактный класс.
На примере использования  в качестве интерфейса между двумя (возможно) бинарно не совместимыми кодами.

Добавлено через 1 минуту и 37 секунд
Цитата(J0ker @  14.11.2008,  20:34 Найти цитируемый пост)
в COM виртуализация применяется для работы с объектами посредством абстрактных интерфейсов

опять пол поста прочитал - и ответил,
а ниже оказывается уже естж такое . )

Автор: powerfox 15.11.2008, 18:05
bomberman, почитайте что-нибудь по ООП, это ключевая вещь. Виртуальные функции обеспечивают динамический полиморфизм.
Гугл в первой же строке дал ответ на ваш вопрос: http://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4
Цитата(J0ker @  14.11.2008,  21:34 Найти цитируемый пост)
в COM виртуализация применяется для работы с объектами посредством абстрактных интерфейсов

Виртуальная функций != виртуализация (во всяком случае я такого употребления слова не встречал).

Автор: J0ker 15.11.2008, 18:30
Цитата(powerfox @  15.11.2008,  18:05 Найти цитируемый пост)
Виртуальная функций != виртуализация (во всяком случае я такого употребления слова не встречал).

ну ессесна !=
ибо первое - конкретное применение второго  smile 

Автор: powerfox 16.11.2008, 00:48
Цитата(J0ker @  15.11.2008,  19:30 Найти цитируемый пост)
ибо первое - конкретное применение второго  smile 

Да? ;)
http://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F

Автор: J0ker 16.11.2008, 04:45
Цитата(powerfox @ 16.11.2008,  00:48)
Цитата(J0ker @  15.11.2008,  19:30 Найти цитируемый пост)
ибо первое - конкретное применение второго  smile 

Да? ;)
http://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F

при чем тут, собстна, виртуализация в вычислениях?
если у вас плохо с английским - так и скажите

Автор: powerfox 16.11.2008, 15:39
J0ker, покажите мне, пожалуйста, где в литературе по ООП используется слово «виртуализация» в отношении виртуальных функций?


Автор: mes 16.11.2008, 16:25
Цитата(powerfox @  16.11.2008,  15:39 Найти цитируемый пост)
покажите мне, пожалуйста, где в литературе по ООП используется слово «виртуализация» в отношении виртуальных функций?

вот к примеру (первое попавшее под руку)
Цитата


3.5.1 Виртуальные функции

В ООП полиморфизм достигается не только описанным выше механизмом наследования и перегрузки методов родителя, но и виртуализацией, позволяющей родительским функциям обращаться к функциям потомков. Полиморфизм реализуется через архитектуру класса, но полиморфными могут быть только функции-члены.

http://www.helloworld.ru/texts/comp/lang/builder/builder/3.htm

Автор: powerfox 16.11.2008, 17:28
Цитата(mes @  16.11.2008,  17:25 Найти цитируемый пост)
http://www.helloworld.ru/texts/comp/lang/b...r/builder/3.htm

Я имел в виду нормальные источники, а не левые ресурсы. Например, стандарт С++, документацию по g++ или «ЯП С++» Стауструпа (у меня есть только на русском). Ни там, ни там слово виртуализация не встречается. А в стандарте находится вся необходимая информация для разработки компилятора. Если обратиться к гуглу, то можно найти несколько страниц, где используют слово «виртуализация», но правильнее (точнее правильно) было бы использовать термин «динамический полиморфизм».

Автор: mes 16.11.2008, 19:00
динамический полиморфизм и виртуализация и виртуальные функции это не одно и то же. Виртуальные функции это один из методов реализации виртуализации, на основе которой и работает динамический полиморфизм.

Автор: J0ker 16.11.2008, 19:20
Модератор: Сообщение скрыто.

Автор: powerfox 16.11.2008, 21:55
J0ker, расслабьтесь и давайте без матов. Всё равно речь идёт об одном и том же. 
Я высказал своё мнение, вы своё.

Цитата(mes @  16.11.2008,  20:00 Найти цитируемый пост)
динамический полиморфизм и виртуализация и виртуальные функции это не одно и то же. Виртуальные функции это один из методов реализации виртуализации, на основе которой и работает динамический полиморфизм.

Я встречал выражение «dynamic despatch».  Таблицу виртуальных методов так же иногда называют таблицей диспетчеризации. Хоть это и редко употребляется (и в основном в отношении управления процессами), но с термином «диспетчеризация» ещё можно согласиться.

Автор: J0ker 19.11.2008, 23:54
Цитата(powerfox @  16.11.2008,  21:55 Найти цитируемый пост)
J0ker, расслабьтесь и давайте без матов. Всё равно речь идёт об одном и том же. 
Я высказал своё мнение, вы своё.

меня немного побанили  smile 
вопрос, собственно, в филологии
я ответственно заявляю, что в данном контексте термин виртуализация абсолютно применим и будет понят любым специалистом без дополнительных пояснений

Добавлено через 2 минуты и 25 секунд
т.к. вы любитель словарей, вот ссылка
http://en.wikipedia.org/wiki/Virtualizing
Цитата

In computing, virtualization is a broad term that refers to the abstraction of computer resources

Автор: powerfox 20.11.2008, 00:43
Цитата(J0ker @  20.11.2008,  00:54 Найти цитируемый пост)
меня немного побанили  smile 

С возвращением smile

Цитата(J0ker @  20.11.2008,  00:54 Найти цитируемый пост)
In computing, virtualization is a broad term that refers to the abstraction of computer resources

Угу. Именно с этим значением я и знаком. Но я не думаю, что «abstraction of computer resources» имеет отношение к вызову виртуальных функций. Используется специальная таблица, нахождение адреса вызова находитсяопределённым способом и виртуализации каких-либо ресурсов не происходит имхо.
Тут нужно вникнуть в то, как механизм работает )

Автор: mes 20.11.2008, 01:07
Цитата(powerfox @  20.11.2008,  00:43 Найти цитируемый пост)
Но я не думаю, что «abstraction of computer resources» имеет отношение к вызову виртуальных функций. Используется специальная таблица, 

ну раз Вы подходите с этой стороны(со стороны реализации, а не абстракции понятия), то интересно как по вашему мнению достигается «abstraction of computer resources» ? неужто обходится без специальной таблицы?

Автор: J0ker 20.11.2008, 05:04
Цитата(powerfox @  20.11.2008,  00:43 Найти цитируемый пост)
Но я не думаю, что «abstraction of computer resources» имеет отношение к вызову виртуальных функций.

имеет самое непосредственное
это не просто совпадение названий - так названо потому, что так оно и есть на самом деле

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)