Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1294 / 466 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
1

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

14.03.2013, 22:36. Показов 1038. Ответов 6

...в голове не укладываются. Помогите кто может

У меня про них сложилось впечатление, что они только усложняют жизнь. Если это не так, с удовольствием послушаю. Стало интересно для начала потому, что не могу понять.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.03.2013, 22:36
Ответы с готовыми решениями:

виртуальные методы
#include<iostream> #include<stdlib.h> using namespace std; class MArray { protected:...

виртуальные методы
как вызвать виртуальный метод базового класса из наследуемого класса? struct A { virtual void...

Виртуальные методы
народ вот пример с виртуальными методами, и вывод этой программы class Ancestor { public: ...

Виртуальные методы
Дан родительский класс Animal (поле кличка). И два наследованных от него класса-потомка: Cat (поле...

6
Don't worry, be happy
16987 / 9865 / 1900
Регистрация: 27.09.2012
Сообщений: 24,466
Записей в блоге: 1
14.03.2013, 22:52 2
Гарантируют позднее связывание
0
3054 / 1459 / 492
Регистрация: 29.11.2010
Сообщений: 2,888
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;
}
1
1294 / 466 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
15.03.2013, 19:07  [ТС] 4
Croessmah, новичку словосочетание "позднее связывание" ничего не говорит

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

Не по теме:

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

0
MayaNash
16.03.2013, 10:42  [ТС]
  #6

Не по теме:

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

0
4294 / 1416 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
16.03.2013, 10:45 7
Керра, "позднее связывание" - это как тема для чтения. Вообще, тот код, что описан выше, реализует частный случай полиморфизма, который без виртуальных функций и не вышел бы. А это еще одна тема для прочтения
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.03.2013, 10:45

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Виртуальные методы
Здраствуйте , вот писал виртуальный метод доступа но почему то не получаеться , подскажите почему...

Виртуальные методы
Всем доброго времени суток! Вопрос следующий. Как я могу функцией делать подмену виртуального...

Наследование и виртуальные методы
В описании задания буквой А) обозначается задание на базовый класс, а буквой Б) - на класс...

Виртуальные методы в структурах
Почему не рекомендуется, или, даже, запрещено использовать виртуальные методы в структурах? ...


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

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

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