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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ нужно составить игру "Доктор Марио" http://www.cyberforum.ru/cpp-beginners/thread808933.html
Нужно написать игру "доктор марио") Это игра,в которой как и в тетрисе выпадают фигурки,только состоящие из 2 частей разных цветов: бело-синие, бело-красные. При соприкосновении одинаковых цветов они сгораю и набираются очки. Помогите пожалуйста,очень нужно в короткий срок((((
C++ Как добавить запятую в аргументы макроса? есть макрос который должен принимать строку в которой есть запятые как это сделать? void some_fun(const char * arg_1, unsigned int arg_2); #define SOME_MAKR(x) some_fun(x); #define SOME_ARG "string", FL_SOME_FLAG_1 | FL_SOME_FLAG_2 SOME_MAKR(SOME_ARG); // <<-- первый вариант вызова всё ок SOME_MAKR("another string", FL_ANOTHER_FLAG); // второй вариант вызова, препроцессор думает... http://www.cyberforum.ru/cpp-beginners/thread808926.html
Работа с потоками C++
Задача поставлена так : Необходимо открыть поток, записать некую информацию и далее закрыть его. Но необходимо, чтобы после закрытия потока необходимо выводить следующую информацию в консоль. Возможно ли это, и если да, то необходим кусок кода, который будет отвечать за это. Заранее благодареню
Сравнение строк C++
Написать собственную функцию, без использования функций стандартной библиотеки, которая сравнивает две строки, игнорируя количество пробелов между словами
C++ Заполнить масив случайными значениями http://www.cyberforum.ru/cpp-beginners/thread808904.html
Помогите с задачей, заранее спасибо)Текст задачи должен быть на русском языке напечатан в теме.
C++ Стек. Перевести выражение из обычной формы записи в постфиксную и записать ее в текстовый файл Ребят, помогите написать код Текстовый файл содержит арифметическое выражение, записанный в обычной инфиксной форме. Перевести выражение из обычной формы записи в постфиксную и записать ее в текстовый файл. Использовать стек. Например, инфиксная форма выражения: а-в, а * в. Постфиксная форма: ав-, ав*. Добавлено через 22 часа 22 минуты помогите подробнее

Показать сообщение отдельно
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
15.03.2013, 00:41     Виртуальные методы
Например, есть животные. Разные. У животных есть количество ног. Разное.
Есть набор животных. Разных. Надо посчитать, сколько у животных ног.

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