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

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

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

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

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

Объясните, для чего необходимы виртуальные функции. Где их рационально использовать.
P.S. Если есть ссылки на толковые материалы - не жалейте.
Заранее благодарен.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2010, 21:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Виртуальные функции (C++):

виртуальные и чисто виртуальные функции - C++
Чем они отличаются?? если можно, с примерами. И как из виртуальной функции сделать чисто виртуальную? #include <iostream> using...

виртуальные функции - C++
Добрый день. Начал изучать виртуальные функции и столкнулся с проблемой. Не могу перегрузить функцию. Объясните что не так и как нужно: ...

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

Виртуальные функции - C++
Создайте класс Word, определите в нем виртуальную функцию-член word_main(*char x), которая выводит на экран фразу: “Я знаю слово x”....

Виртуальные функции - C++
Доброго времени суток. Есть задание. Создать абстрактный класс Function (функция) с виртуальными методами вычисления значения функции...

виртуальные функции - C++
сделать какой либо из методов класса виртуальным #include<iostream.h> #include<stdio.h> class chislo { int a; public: ...

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

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

собственно зачем нужна вирт. ф-ция, которая делает одно и то же
1
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
05.12.2010, 00:44 #9
norge_goth, А как насчет иерархии классов? В одном производном нужна, а в другом нет. Сомнительно конечно, но мало-ли что бывает.
2
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
05.12.2010, 00:51 #10
Цитата Сообщение от ForEveR Посмотреть сообщение
А как насчет иерархии классов? В одном производном нужна, а в другом нет. Сомнительно конечно, но мало-ли что бывает.
хотя да и такое может быть
1
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
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
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
05.12.2010, 01:26 #12
rangerx, Да, конечно. Я понимаю это. Но, ведь в конкретной задаче, нам может не понадобиться использовать пингвинов и др. нелетающих птиц, а только тех которые летают, и тогда проектирование класса будет вполне корректно. Ну это все конечно спорные вопросы. Правила хорошего тона говорят, что это не корректно, а реальность и постановка задачи говорит другое... Как-то так.
Ну а если все птицы - то разбить на два класса получается: летающие птицы, нелетающие птицы. Или просто в базовом не писать виртуальный метод fly.
1
05.12.2010, 01:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2010, 01:26
Привет! Вот еще темы с ответами:

виртуальные функции - C++
интересует 2 вопроса:1)Какими элементами могут отличаться экземпляры одной виртуальной функции, находящиеся в разных производных...

Виртуальные функции - C++
Подскажите пожалуйста, как передать переменную из одной виртуальной функции в другую. Вот код программы работает правильно, но в остальных...

Виртуальные функции - C++
Объясните пожалуйста зачем нужны чисто виртуальные функции?

Виртуальные функции - C++
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;string.h&gt; #include &lt;conio.h&gt; using namespace std; class Array { ...


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

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

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