Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 01.10.2010
Сообщений: 50
1

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

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

Объясните, для чего необходимы виртуальные функции. Где их рационально использовать.
P.S. Если есть ссылки на толковые материалы - не жалейте.
Заранее благодарен.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.12.2010, 21:31
Ответы с готовыми решениями:

Виртуальные и чисто виртуальные функции
Чем они отличаются?? если можно, с примерами. И как из виртуальной функции сделать чисто...

виртуальные функции
C++ подскажите пожалуста на словах код писать ненадо. как преопределить функцию virtual Print(). ...

Виртуальные функции
Составить программу в С Buildere. Объявить базовый класс с именем person {имя, возраст, группа}....

Виртуальные функции
#include <iostream> #include <string> #include <string.h> #include <conio.h> using namespace...

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

Насчет статического полиформизма - ф-ция определяется на этапе компиляции
1
В астрале
Эксперт С++
8035 / 4792 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
05.12.2010, 00:25 7
Цитата Сообщение от norge_goth Посмотреть сообщение
При наследовании виртуальные ф-ции базового класса должны быть преопределены в производном классе
Отнюдь. Это верно только для чисто-виртуальных функций и только в том случае, если нужно, чтобы производный класс не был абстрактным.
1
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
05.12.2010, 00:41 8
Цитата Сообщение от ForEveR Посмотреть сообщение
Отнюдь. Это верно только для чисто-виртуальных функций и только в том случае, если нужно, чтобы производный класс не был абстрактным.
вообще да, но виртуальная ф-ция которая не переопределена в производном теряет свой "виртуальный" смысл

собственно зачем нужна вирт. ф-ция, которая делает одно и то же
1
В астрале
Эксперт С++
8035 / 4792 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
05.12.2010, 00:44 9
norge_goth, А как насчет иерархии классов? В одном производном нужна, а в другом нет. Сомнительно конечно, но мало-ли что бывает.
2
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
05.12.2010, 00:51 10
Цитата Сообщение от ForEveR Посмотреть сообщение
А как насчет иерархии классов? В одном производном нужна, а в другом нет. Сомнительно конечно, но мало-ли что бывает.
хотя да и такое может быть
1
2015 / 1614 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
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 спроектирован неверно.
3
В астрале
Эксперт С++
8035 / 4792 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
05.12.2010, 01:26 12
rangerx, Да, конечно. Я понимаю это. Но, ведь в конкретной задаче, нам может не понадобиться использовать пингвинов и др. нелетающих птиц, а только тех которые летают, и тогда проектирование класса будет вполне корректно. Ну это все конечно спорные вопросы. Правила хорошего тона говорят, что это не корректно, а реальность и постановка задачи говорит другое... Как-то так.
Ну а если все птицы - то разбить на два класса получается: летающие птицы, нелетающие птицы. Или просто в базовом не писать виртуальный метод fly.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.12.2010, 01:26

Виртуальные функции
Создать базовый класс «молодой человек» и производные классы «студент», «военнослужащий», «военный...

Виртуальные функции
Объясните строку 106 И еще, почему перед каждой x1 x2 y стоит звездочка. Я вроде понимаю что это...

виртуальные функции
Здравствуйте.Перечитал различные статьи,но не могу до конца вникнуть в смысл использования...

виртуальные функции
Всем привет, помогите с исправлением функции #include&lt;iostream.h&gt; #include&lt;conio.h&gt;...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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