Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
kowandser
0 / 0 / 0
Регистрация: 01.10.2010
Сообщений: 50
#1

Виртуальные функции - C++

04.12.2010, 21:31. Просмотров 1225. Ответов 11
Метки нет (Все метки)

Объясните, для чего необходимы виртуальные функции. Где их рационально использовать.
P.S. Если есть ссылки на толковые материалы - не жалейте.
Заранее благодарен.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Flamе
9 / 9 / 0
Регистрация: 25.10.2009
Сообщений: 152
04.12.2010, 22:13     Виртуальные функции #2
Обычно виртуальные функции используются при наследовании. в родительском классе объявляют какую-либо функцию виртуальной, и тогда при вызове этой функции для объектов наследников будет использоваться одноимённая функция только уже не из родительского класса, а из самого наследника. если в родительском классе есть хоть одна виртуальная функция, то деструктор обязательно нужно объявлять тоже как виртуальный...
вот, что-то типа этого))
kowandser
0 / 0 / 0
Регистрация: 01.10.2010
Сообщений: 50
04.12.2010, 23:11  [ТС]     Виртуальные функции #3
А что-нибудь про объекты?
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
04.12.2010, 23:19     Виртуальные функции #4
Цитата Сообщение от kowandser Посмотреть сообщение
А что-нибудь про объекты?
Класс является логической абстракцией, описанием нового типа переменной, а объект - его физическая сущность
kowandser
0 / 0 / 0
Регистрация: 01.10.2010
Сообщений: 50
04.12.2010, 23:35  [ТС]     Виртуальные функции #5
Цитата Сообщение от norge_goth Посмотреть сообщение
Класс является логической абстракцией, описанием нового типа переменной, а объект - его физическая сущность
Про объекты класса с виртуальной функцией?
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
04.12.2010, 23:44     Виртуальные функции #6
Цитата Сообщение от kowandser Посмотреть сообщение
Про объекты класса с виртуальной функцией?
возьми лучше книгу например Г. Шилдта почитай для начала на рус торренте есть там четко описаны для чего они надо.
а так по каплях могу сказать виртуальные ф-ции поддерживают динамический полиформизм в то время когда перегрузка ф-ций/операторов статический полиформизм,
в случае виртуальных ф-ций: во время выполнения определяется ф-ция для конкретного объекта, то есть если у нас есть класс А и Б, Б производный от А и в А есть виртуальная ф-ция, в Б имеется ее перегруженная версия, то если во время выполнения объект Б есть активным - используется его виртуальная ф-ция, А - активный, используется виртуальная ф-ция А.
При наследовании виртуальные ф-ции базового класса должны быть преопределены в производном классе, так же есть понятие чисто виртуальных ф-ций, но не буду забивать тебе голову лучше книгу почитай и сам попробуй разобрать

Насчет статического полиформизма - ф-ция определяется на этапе компиляции
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
05.12.2010, 00:25     Виртуальные функции #7
Цитата Сообщение от norge_goth Посмотреть сообщение
При наследовании виртуальные ф-ции базового класса должны быть преопределены в производном классе
Отнюдь. Это верно только для чисто-виртуальных функций и только в том случае, если нужно, чтобы производный класс не был абстрактным.
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
05.12.2010, 00:41     Виртуальные функции #8
Цитата Сообщение от ForEveR Посмотреть сообщение
Отнюдь. Это верно только для чисто-виртуальных функций и только в том случае, если нужно, чтобы производный класс не был абстрактным.
вообще да, но виртуальная ф-ция которая не переопределена в производном теряет свой "виртуальный" смысл

собственно зачем нужна вирт. ф-ция, которая делает одно и то же
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
05.12.2010, 00:44     Виртуальные функции #9
norge_goth, А как насчет иерархии классов? В одном производном нужна, а в другом нет. Сомнительно конечно, но мало-ли что бывает.
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
05.12.2010, 00:51     Виртуальные функции #10
Цитата Сообщение от ForEveR Посмотреть сообщение
А как насчет иерархии классов? В одном производном нужна, а в другом нет. Сомнительно конечно, но мало-ли что бывает.
хотя да и такое может быть
rangerx
1931 / 1540 / 141
Регистрация: 31.05.2009
Сообщений: 2,905
05.12.2010, 01:21     Виртуальные функции #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от kowandser Посмотреть сообщение
Объясните, для чего необходимы виртуальные функции. Где их рационально использовать.
Об этом написано в любой книге по C++. Простейший пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
 
class Shape
{
   public:
      virtual void draw() = 0;
      virtual ~Shape() { }
};
 
class Rectangle : public Shape
{
   public:
      virtual void draw() { puts("Rectangle"); }
};
 
class Circle : public Shape
{
   public:
      virtual void draw() { puts("Circle"); }
};
 
int  main()
{    
   const int n = 5;
   Shape* shapes[n] = { new Circle(), new Rectangle(), new Rectangle(), new Circle(), new Circle() };
 
   for(int i = 0; i < n; ++i)
      shapes[i]->draw();
 
   // освобождаем память...
        
   return 0;
}
Цитата Сообщение от ForEveR Посмотреть сообщение
А как насчет иерархии классов? В одном производном нужна, а в другом нет. Сомнительно конечно, но мало-ли что бывает.
Как правило это говорит о неправильном проектировании. Классический пример класс Bird, в котором есть виртуальный метод fly(птицы умеют летать). К примеру, пингвин это птица, и казалось бы вполне логично было бы сделать его наследником Bird, но пингвины НЕ умеют летать. Следовательно класс Bird спроектирован неверно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2010, 01:26     Виртуальные функции
Еще ссылки по теме:

Виртуальные функции C++
Виртуальные функции C++
C++ Виртуальные функции
C++ виртуальные функции
C++ Виртуальные функции

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
05.12.2010, 01:26     Виртуальные функции #12
rangerx, Да, конечно. Я понимаю это. Но, ведь в конкретной задаче, нам может не понадобиться использовать пингвинов и др. нелетающих птиц, а только тех которые летают, и тогда проектирование класса будет вполне корректно. Ну это все конечно спорные вопросы. Правила хорошего тона говорят, что это не корректно, а реальность и постановка задачи говорит другое... Как-то так.
Ну а если все птицы - то разбить на два класса получается: летающие птицы, нелетающие птицы. Или просто в базовом не писать виртуальный метод fly.
Yandex
Объявления
05.12.2010, 01:26     Виртуальные функции
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru