Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
thormodred
0 / 0 / 0
Регистрация: 31.03.2015
Сообщений: 6
1

Вызов полиморфной функции

24.06.2017, 15:58. Просмотров 292. Ответов 14
Метки нет (Все метки)

Добрый день. Никак не могу понять, почему данная программа все же выводит "А". Не мог бы кто-нибудь объяснить?
Заранее благодарен.

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
#include <iostream>
 
struct A {
  virtual void foo() const
  {
    std::cout << "A\n";
  }
};
struct B: public A {
  void foo() const
  {
    std::cout << "B\n";
  }
};
 
void bar (A a)
{
  a.foo();
}
 
int main (int, char *[])
{
  B b;
 
  bar(b);
  return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2017, 15:58
Ответы с готовыми решениями:

Возврат значения из полиморфной функции
Доброго времени суток всем. Ребят не знаю как правильно сформулировать свой...

Ostream и ofstream в качестве аргументов полиморфной функции
Здравствуйте! Перегрузил оператор &lt;&lt; с ostream и ofstream для пользовательского...

Вызов функции внутри другой функции с передачей локальной переменной по ссылке
Столкнулся с очень с интересной проблемой. Можно ли так делать? #include...

Вызов родовой функции (нужно передать массив в качестве аргумента функции через указатель)
#include &lt;iostream&gt; using namespace std; template &lt;class T1&gt; class mas { ...

Не работает без указателя вызов функции в функции
int AmountOfSquares(int **Array) { NumberOfSquares++; for (i =...

14
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
24.06.2017, 16:48 2
thormodred, потому что полиморфизм работает только через ссылку или указатель.

попробуйте void bar (A& a)
0
hoggy
Нарушитель
Эксперт С++
7081 / 3125 / 647
Регистрация: 15.11.2014
Сообщений: 7,172
Завершенные тесты: 1
24.06.2017, 17:02 3
Цитата Сообщение от thormodred Посмотреть сообщение
Никак не могу понять, почему данная программа все же выводит "А". Не мог бы кто-нибудь объяснить?
вы передаете объект класса B
Цитата Сообщение от thormodred Посмотреть сообщение
bar(b);
но функция:
Цитата Сообщение от thormodred Посмотреть сообщение
void bar (A a)
принимает объекты класса A по значению.

происходит создание копии объекта A
по прототипу объекта класса B

сам же объект класса А:
Цитата Сообщение от thormodred Посмотреть сообщение
struct A {
* virtual void foo() const
* {
* * std::cout << "A\n";
* }
};
выводит 'А'
1
savenkodenys
11 / 11 / 10
Регистрация: 04.06.2017
Сообщений: 99
24.06.2017, 18:34 4
thormodred, потому что у тебя класс В является производным от класса А. Конструкторы и деструкторы вызываются следующим образом: конструктор базового класса (А), конструктор производного класса (В), деструктор В, деструктор А.
0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
24.06.2017, 18:41 5
savenkodenys, очень полезная информация, а к вопросу, она тут причём? От себя добавлю, что Меркурий первая планета к солнцу. Кто еще знает, что не по теме?)
0
Antikl
с++
296 / 288 / 154
Регистрация: 15.07.2015
Сообщений: 1,550
Завершенные тесты: 6
24.06.2017, 18:44 6
а вы знали что планета земля по счету 3-я
0
savenkodenys
11 / 11 / 10
Регистрация: 04.06.2017
Сообщений: 99
24.06.2017, 18:45 7
rikimaru2013,
Цитата Сообщение от thormodred Посмотреть сообщение
Никак не могу понять, почему данная программа все же выводит "А". Не мог бы кто-нибудь объяснить?
0
Antikl
с++
296 / 288 / 154
Регистрация: 15.07.2015
Сообщений: 1,550
Завершенные тесты: 6
24.06.2017, 18:51 8
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
#include <iostream>
 
struct A {
  virtual void foo() const
  {
    std::cout << "A\n";
  }
};
struct B: public A {
  void foo() const
  {
    std::cout << "B\n";
  }
};
 
void bar (A&a)
{
  a.foo();
}
 
int main (int, char *[])
{
  B b;
 
  bar(b);
  return 0;
}
0
Croessmah
++Ͻ
14609 / 8363 / 1576
Регистрация: 27.09.2012
Сообщений: 20,557
Записей в блоге: 2
Завершенные тесты: 1
24.06.2017, 18:52 9
Цитата Сообщение от savenkodenys Посмотреть сообщение
Конструкторы и деструкторы вызываются следующим образом
Немного не так. Вызывается сначала конструктор производного и уже оттуда вызываются конструкторы базовых классов.
Порядок вызова конструкторов
0
Antikl
с++
296 / 288 / 154
Регистрация: 15.07.2015
Сообщений: 1,550
Завершенные тесты: 6
24.06.2017, 18:52 10
вам уже написали что если так A a то создается копия объекта а так по ссылке A&a
0
hoggy
Нарушитель
Эксперт С++
7081 / 3125 / 647
Регистрация: 15.11.2014
Сообщений: 7,172
Завершенные тесты: 1
24.06.2017, 19:07 11
Цитата Сообщение от savenkodenys Посмотреть сообщение
rikimaru2013,
Сообщение от thormodred
Никак не могу понять, почему данная программа все же выводит "А". Не мог бы кто-нибудь объяснить?
а в килобайте не всегда 1024 байта.

Добавлено через 32 секунды
Цитата Сообщение от Antikl Посмотреть сообщение
а вы знали что планета земля по счету 3-я
вот теперь я точно понял,
почему там класс А печатаеццо.
0
Antikl
с++
296 / 288 / 154
Регистрация: 15.07.2015
Сообщений: 1,550
Завершенные тесты: 6
24.06.2017, 19:11 12
Цитата Сообщение от hoggy Посмотреть сообщение
почему там класс А печатаеццо.
0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
24.06.2017, 19:23 13
Цитата Сообщение от Croessmah Посмотреть сообщение
Немного не так. Вызывается сначала конструктор производного и уже оттуда вызываются конструкторы базовых классов.
Вы не путаете список инициализации производного и сам конструктор производного? Вызов всегда подразумевал вход в тело функции, а там входом и не пахнет
0
Croessmah
++Ͻ
14609 / 8363 / 1576
Регистрация: 27.09.2012
Сообщений: 20,557
Записей в блоге: 2
Завершенные тесты: 1
25.06.2017, 09:09 14
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Вызов всегда подразумевал вход в тело функции, а там входом и не пахнет
Вызов предполагает вызов, а куда там пошло - это уже не его задача.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Вы не путаете список инициализации производного и сам конструктор производного?
А что, у нас список инициализации не в конструкторе, а в сферическом вакууме?
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4608 / 2422 / 674
Регистрация: 18.10.2014
Сообщений: 4,133
25.06.2017, 09:49 15
Цитата Сообщение от thormodred Посмотреть сообщение
Никак не могу понять, почему данная программа все же выводит "А".
Выбор конкретной полиморфной функции делается на основе анализа динамического типа объекта, использованного в вызове. У вас объект имеет тип A. Поэтому и вызваться будет функция класса A.
0
25.06.2017, 09:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2017, 09:49

Вызов функции в возврате значения функции
Есть функция: int function1(a) { ...... return...

Вызов функции с массивом указателей на функции
Как вызвать такую функцию в maine? void Grafik(void (*funks)(int), int...

Вызов функции в параметре другой функции
программа: #include &lt;iostream&gt; using namespace std; struct E { E()...


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

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

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