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

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

Войти
Регистрация
Восстановить пароль
 
ElvenDragon
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361
#1

Делимся знаниями по С++ - C++

03.07.2011, 11:41. Просмотров 734. Ответов 10
Метки нет (Все метки)

По вашему зачем нужна виртуальная функция в программе?
Какой от нее толк если она вызывается как обычная функция. Да я знаю что полиморфизм тут. Но
по мне так достаточно одного базового класса который играет роль обобщенного интерфейса. Там тоже есть функции... У меня уже есть своя версия насчет виртуальной функции зачем она нужна и как её использовать в пользу в программе. Я хотел бы услышать вашу версию ,а потом сравнить со своей.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2011, 11:41     Делимся знаниями по С++
Посмотрите здесь:

Делимся. - Web
Доброго времени суток всем посетителям этой темы!=) Хочу попросить вас поделиться самой откровенной информацией по нескольким...

Делимся наработками - MS Access
в этой теме предлагаю выкладывать интересные наработки по акцессу... зы. в дальнейшем на основе их можно будет создать темы "важное" ...

Samsung - делимся впечатлениями - Обо всем!
самсунг

Делимся результатами 3dMark`11 - Выбор компьютера
виложуєм в ету тему свои результати в 11 маку и конфигурации

Ведьмак 2: делимся впечатлениями - RPG
Кто уже играл, поделитесь впечатлениями. То есть: лучше ли Ведьмак 2 по сравнению с Ведьмак, плюсы, минусы, в общем стоит ли брать игру?

Делимся хорошими детективами - Литература
Господа, посоветуйте что-нибудь в жанре детектива, так чтоб не ширпотреб, а со смыслом, что можно литературой назвать. Агату Кристи и Конан...

FX-6300, делимся опытом - Процессоры
Всем здрасте. Вот хотел спросить у вас, кто чего добился в разгоне 6300? Я разгонял до 4.7 поднятием множителя. Напряжение 1.35....

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
03.07.2011, 12:04     Делимся знаниями по С++ #2
сам ответил на свой вопрос:

Цитата Сообщение от ElvenDragon Посмотреть сообщение
По вашему зачем нужна виртуальная функция в программе?
Цитата Сообщение от ElvenDragon Посмотреть сообщение
я знаю что полиморфизм тут
полиморфизма мало?

p.s. там где есть виртуальная функция обычно должен присутствовать виртуальный деструктор

Добавлено через 13 минут
dynamic_cast typeid[] - вот что ещё даёт виртуальная функция. typeid работает и для неполиморфных типов, но в этом случае во время компиляции просто подставляется всё
ElvenDragon
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361
03.07.2011, 12:06  [ТС]     Делимся знаниями по С++ #3
Цитата Сообщение от pito211 Посмотреть сообщение
сам ответил на свой вопрос:





полиморфизма мало?

p.s. там где есть виртуальная функция обычно должен присутствовать виртуальный деструктор
Та дело не в этом. Я хочу знать какой от неё толк. Твоё мнение ,а не то что в книге намалевали и написали.

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
#include <iostream>
using namespace std;
 
 
class lok {
public:
  int z;
  virtual void pop() { cout << z; }
  lok(int i) { z = i;}
};
 
class nn : public lok {
public:
  void pop() { cout << z+1; }
  nn(int i) : lok(i) {}
};
 
 
int main() {
  lok *p;
  nn k(5);
  p = &k;
  p -> pop();
  return 0;
}
От такой пример в книге у меня. С таким успехом здесь в программе можно было использовать обычные функции. Какой толк от виртуальных функций в этом примере??
nameless
Эксперт C++
334 / 298 / 14
Регистрация: 16.06.2009
Сообщений: 486
03.07.2011, 12:15     Делимся знаниями по С++ #4
ElvenDragon,

Цитата Сообщение от ElvenDragon Посмотреть сообщение
От такой пример в книге у меня. С таким успехом здесь в программе можно было использовать обычные функции. Какой толк от виртуальных функций в этом примере??
Вот именно, что это пример, который показывает как использовать виртуальные функции, а не зачем.
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
03.07.2011, 12:17     Делимся знаниями по С++ #5
убери виртуал, получишь другой результат

Добавлено через 44 секунды
пример конечно надуманный, но он показывает и как и зачем использовать виртуальность
nameless
Эксперт C++
334 / 298 / 14
Регистрация: 16.06.2009
Сообщений: 486
03.07.2011, 12:19     Делимся знаниями по С++ #6
Цитата Сообщение от pito211 Посмотреть сообщение
пример конечно надуманный, но он показывает и как и зачем использовать виртуальность
Ну все таки было бы разумнее автору книги продемонстрировать другой пример.
ElvenDragon
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361
03.07.2011, 12:20  [ТС]     Делимся знаниями по С++ #7
Цитата Сообщение от nameless Посмотреть сообщение
ElvenDragon,



Вот именно, что это пример, который показывает как использовать виртуальные функции, а не зачем.
Хорошо тогда зачем она в программе нужна? Тока не надо писать что она нужна для реализации полиморфизма я это и так знаю. Покажи зачем она нужна мне в программе???
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
03.07.2011, 12:23     Делимся знаниями по С++ #8
вроде у страуструпа в книге написан примерчик типа
C++
1
2
3
4
class employer
{
}
class manager : public employer
а тут ничего не говорящие имена... в каком то плане действительно пример в твоей книжке неудачный

Добавлено через 2 минуты
Цитата Сообщение от ElvenDragon Посмотреть сообщение
Хорошо тогда зачем она в программе нужна
чтобы во время выполнения определять настоящий тип объекта для которого вызывается функция и вызывать соответсвующую версию, а не версию из какого то класса предка
botasa
3 / 3 / 0
Регистрация: 18.01.2011
Сообщений: 131
03.07.2011, 12:27     Делимся знаниями по С++ #9
http://ru.wikipedia.org/wiki/%D0%92%...82%D0%BE%D0%B4
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
03.07.2011, 12:31     Делимся знаниями по С++ #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class employer
{
public:
   virtual void print();
}
 
class manager : public employer
{
public:
  void print()
  {
     employer::print();   //Менеджер - рабочий, выводится инфа соответсвующая любому рабочему
     cout << "blalala";  //Дополнительная инфа, только для менеджера
  }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main
{
   ...
   vector<employer*> vct;
   vct.push_back(new employer(...));
   vct.push_back(new manager(...));
   ...
   for (const_iterator it = vct.bgin(); it != vcr.end(); it++)
   {
      it->print(); //Здесь всегда будет выводится правильная инфа,  
                       //несмотря на то что в векторе находятся  employer*, инфа о менеджерах будет выведена
   } 
}
Добавлено через 1 минуту
попробуй добиться того же эффекта без виртуальных функций
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2011, 12:38     Делимся знаниями по С++
Еще ссылки по теме:

Реальные программы - делимся со всеми - C#
Давайте делиться реальными прогами на С#, т.к. у всех возникают часто похожие проблемы в коде и их можно обсудить на Конкретных примерах....

Qt: Учимся вместе. Делимся опытом. - C++ Qt
Сейчас я пытаюсь осваивать Qt. Я плохо знаю C++ и Qt в частности... поэтому часто бывают моменты, когда для решения, казалось бы, простой...

Делимся опытом встреч с WannaCry(pt) - Безопасность
Профессионалы компьютерной безопасности, рабочие сервис-центров или просто сосед-хакер-ы, поделитесь своим опытом встреч с wannacry, и...

Assassin's Creed III: делимся впечатлениями - RPG
Привет народ. Поделитесь впечатлениями, кто играл в игру Assasin's Creed III.

Пользователи ASUS eee PC - делимся советами и предложениями - Ноутбуки
У меня старый добрый ASUS eee PC 4G. Недавно столкнулся с вопросом, что есть необходимость в установке Windows наряду с linux, причем...


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

Или воспользуйтесь поиском по форуму:
ElvenDragon
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361
03.07.2011, 12:38  [ТС]     Делимся знаниями по С++ #11
Цитата Сообщение от pito211 Посмотреть сообщение
вроде у страуструпа в книге написан примерчик типа
C++
1
2
3
4
class employer
{
}
class manager : public employer
а тут ничего не говорящие имена... в каком то плане действительно пример в твоей книжке неудачный

Добавлено через 2 минуты

чтобы во время выполнения определять настоящий тип объекта для которого вызывается функция и вызывать соответсвующую версию, а не версию из какого то класса предка
Тоже такое в книге есть. Теперь вот моя версия и проверенная зачем нужна виртуальная функция.
Как мы знаем фундамент на котором С++ строит свою поддержку полиморфизма это указатели на базовые классы и наследование. А конкретное средство которое реализует полиморфизм это виртуальная функция. Так вот указатель на базовый класс может указывать ток на базовые члены в производном объекте ,а на объявленные в производном не может(спецефические). И что получается обобщенный интерфейс который не имеет доступа к этому классу. Это тоже самое что прилепить руль к тачке и не иметь доступа к газу и тормозу. То есть наш обобщенный интерфейс реализует указатель на базовый класс и наследование. И все же доступа мы к тачке так и получили(к классу). И тут появляется виртуальная функция к ней доступ указатель на базовый класс имеет хоть и она является специфическим членом базового класса. И таким образов с помощью неё мы можем обращатся к специфическим членам производного класса. Она играет роль функции доступа. Таким образом мы получили доступ к нашей тачке(классу). Вот полезный пример использования виртуальной функции. Ток простой.
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
#include <iostream>
using namespace std;
 
 
class lok {
public:
  int z;
  virtual void pop() { cout << z; }
  lok(int i) { z = i;}
};
 
class nn : public lok {
public:
  int i;
  void pop() { 
    i = 3;
    cout << i;
   }
  nn(int i) : lok(i) {}
};
 
 
int main() {
  lok *p;
  nn k(5);
  p = &k;
  p -> pop();
  return 0;
}
Окончательный ответ виртуальная функция нужна для того чтобы получить доступ к специфическим членам производного класса посредством указателя на базовый класс.
Yandex
Объявления
03.07.2011, 12:38     Делимся знаниями по С++
Ответ Создать тему
Опции темы

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