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

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

Войти
Регистрация
Восстановить пароль
 
MayaNash
1285 / 453 / 47
Регистрация: 24.08.2011
Сообщений: 2,207
#1

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

14.03.2013, 22:36. Просмотров 404. Ответов 6

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

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

Виртуальные методы - C++
народ вот пример с виртуальными методами, и вывод этой программы class Ancestor { public: virtual void function1 () { cout...

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

виртуальные методы - C++
как вызвать виртуальный метод базового класса из наследуемого класса? struct A { virtual void vf() { printf("A"); } ...

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

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

виртуальные методы - C++
#include<iostream> #include<stdlib.h> using namespace std; class MArray { protected: static const int MAX=512; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Модератор
Эксперт CЭксперт С++
13135 / 7398 / 828
Регистрация: 27.09.2012
Сообщений: 18,234
Записей в блоге: 3
Завершенные тесты: 1
14.03.2013, 22:52 #2
Гарантируют позднее связывание
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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;
}
MayaNash
1285 / 453 / 47
Регистрация: 24.08.2011
Сообщений: 2,207
15.03.2013, 19:07  [ТС] #4
Croessmah, новичку словосочетание "позднее связывание" ничего не говорит

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

Не по теме:

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

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

Не по теме:

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

BumerangSP
4286 / 1408 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
16.03.2013, 10:45 #7
Керра, "позднее связывание" - это как тема для чтения. Вообще, тот код, что описан выше, реализует частный случай полиморфизма, который без виртуальных функций и не вышел бы. А это еще одна тема для прочтения
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2013, 10:45
Привет! Вот еще темы с ответами:

Наследование и виртуальные методы - C++
Начал разбираться с темой наследование и не совсем понимаю как наследуются виртуальные методы, конструкторы и деструкторы виртуальные и...

Виртуальные методы(теория) - C++
Здравствуйте уважаемые форумчане! В ходе обучения языку с++ возник вопрос непонимания назначения виртуальных методов. Попытался...

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

Виртуальные методы класса - C++
Скажите, зачем нужны виртуальные методы? Почему нельзя использовать стандартные? Спасибо.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.03.2013, 10:45
Ответ Создать тему
Опции темы

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