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

Виртуальные методы - C++

Восстановить пароль Регистрация
 
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
14.03.2013, 22:36     Виртуальные методы #1
...в голове не укладываются. Помогите кто может

У меня про них сложилось впечатление, что они только усложняют жизнь. Если это не так, с удовольствием послушаю. Стало интересно для начала потому, что не могу понять.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2013, 22:36     Виртуальные методы
Посмотрите здесь:

C++ виртуальные методы
C++ Виртуальные методы
Виртуальные методы класса C++
Наследование и виртуальные методы C++
C++ Виртуальные методы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
14.03.2013, 22:52     Виртуальные методы #2
Гарантируют позднее связывание
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
15.03.2013, 00:41     Виртуальные методы #3
Например, есть животные. Разные. У животных есть количество ног. Разное.
Есть набор животных. Разных. Надо посчитать, сколько у животных ног.

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <ctime>
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <string>
#include <cmath>
 
// класс жывотного
class Animal {
 public:
  int getNumberOfLegs() const {
    return 0;
  };
};
 
// собака о четырех ногах
class Dog : public Animal {
 public:
  int getNumberOfLegs() const {
    return 4;
  }
};
 
// петух о двух ногах
class Roaster : public Animal  {
 public:
  int getNumberOfLegs() const {
    return 2;
  }
};
 
int main(int argc, char **argv) {
  srand(time(0));
 
  const int size = 10;
  // список животных
  Animal *animals[size];
 
  // случайным образом его формируем из собак и петухов
  for (int i = 0; i < size; ++i) {
    if (rand() % 2)
      animals[i] = new Dog();
    else
      animals[i] = new Roaster();
  }
 
  // считаем ноги
  int totalNumberOfLegs = 0;
  for (int i = 0; i < size; ++i) {
    totalNumberOfLegs += animals[i]->getNumberOfLegs();
  }
 
  // и смачно получаем ноль
  std::cout << "All animals have " << totalNumberOfLegs << " legs." << std::endl;
 
  std::cin.get();
  return 0;
}
Почему же получили ноль? Потому что при подсчете ног вызывался метод класса Animal, закономерно возвращавший ноль.

Как же сделать так, чтобы вызывался метод соответствующих созданных динамически классов?! Для этого и придумали модификатор virtual.

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <ctime>
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <string>
#include <cmath>
 
class Animal {
 public:
  // сделаем функцию виртуальной
  virtual int getNumberOfLegs() const {
    return 0;
  };
};
 
class Dog : public Animal {
 public:
  int getNumberOfLegs() const {
    return 4;
  }
};
 
class Roaster : public Animal  {
 public:
  int getNumberOfLegs() const {
    return 2;
  }
};
 
int main(int argc, char **argv) {
  srand(time(0));
 
  const int size = 10;
  Animal *animals[size];
 
  for (int i = 0; i < size; ++i) {
    if (rand() % 2)
      animals[i] = new Dog();
    else
      animals[i] = new Roaster();
  }
 
  int totalNumberOfLegs = 0;
  for (int i = 0; i < size; ++i) {
    // вызывается уже совершенно другой метод
    totalNumberOfLegs += animals[i]->getNumberOfLegs();
  }
 
  // получили значение
  std::cout << "All animals have " << totalNumberOfLegs << " legs." << std::endl;
 
  std::cin.get();
  return 0;
}
Добавлено через 4 минуты
Пример по-короче.
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
#include <ctime>
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <string>
#include <cmath>
 
class Base {
 public:
  virtual int virtualMethod() const { return 0; }
  int nonVirtualMethod() const { return 0; }
};
 
class Derived : public Base {
 public:
  int virtualMethod() const { return 1; }
  int nonVirtualMethod() const { return 1; }
};
 
int main(int argc, char **argv) {
  srand(time(0));
 
  Base *b = new Derived();
  
  // âèðòóГ*ëüГ*ûé ìåòîä. âûçîâåòñÿ ìåòîä ïîòîìêГ*
  std::cout << b->virtualMethod() << " : ";
  // Г*ГҐ âèðòóГ*ëüГ*ûé ìåòîä. âûçîâåòñÿ ìåòîä ðîäèòåëÿ
  std::cout << b->nonVirtualMethod() << std::endl;
 
  std::cin.get();
  return 0;
}
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
15.03.2013, 19:07  [ТС]     Виртуальные методы #4
Croessmah, новичку словосочетание "позднее связывание" ничего не говорит

lemegeton, благодарю, дошло
Croessmah
15.03.2013, 20:14
  #5

Не по теме:

Цитата Сообщение от Керра Посмотреть сообщение
новичку словосочетание "позднее связывание" ничего не говорит
Зато открывает горизонты для самостоятельной работы
ИМХО, когда доходишь до чего то сам, то лучше усваивается и очень надолго.

Керра
16.03.2013, 10:42  [ТС]
  #6

Не по теме:

Croessmah, однако да)) (с поздним связыванием разобралась)

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2013, 10:45     Виртуальные методы
Еще ссылки по теме:

Виртуальные методы C++
Наследование и виртуальные методы C++
C++ Виртуальные методы

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

Или воспользуйтесь поиском по форуму:
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
16.03.2013, 10:45     Виртуальные методы #7
Керра, "позднее связывание" - это как тема для чтения. Вообще, тот код, что описан выше, реализует частный случай полиморфизма, который без виртуальных функций и не вышел бы. А это еще одна тема для прочтения
Yandex
Объявления
16.03.2013, 10:45     Виртуальные методы
Ответ Создать тему

Метки
виртуальные, методы
Опции темы

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