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

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

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

Делимся наработками MS Access
Делимся хорошими детективами
Web Делимся.
Делимся результатами 3dMark`11
C# Реальные программы - делимся со всеми
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
03.07.2011, 12:04     Делимся знаниями по С++ #2
сам ответил на свой вопрос:

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

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

Добавлено через 13 минут
dynamic_cast typeid[] - вот что ещё даёт виртуальная функция. typeid работает и для неполиморфных типов, но в этом случае во время компиляции просто подставляется всё
ElvenDragon
 Аватар для ElvenDragon
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 360
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++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
03.07.2011, 12:15     Делимся знаниями по С++ #4
ElvenDragon,

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

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



Вот именно, что это пример, который показывает как использовать виртуальные функции, а не зачем.
Хорошо тогда зачем она в программе нужна? Тока не надо писать что она нужна для реализации полиморфизма я это и так знаю. Покажи зачем она нужна мне в программе???
pito211
 Аватар для 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
 Аватар для 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 Qt: Учимся вместе. Делимся опытом.
Роботостроение и умный дом. Делимся
Samsung - делимся впечатлениями

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

Или воспользуйтесь поиском по форуму:
ElvenDragon
 Аватар для ElvenDragon
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 360
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     Делимся знаниями по С++
Ответ Создать тему
Опции темы

Текущее время: 02:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru