Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
thormodred
0 / 0 / 0
Регистрация: 31.03.2015
Сообщений: 6
#1

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

24.06.2017, 15:58. Просмотров 227. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вызов полиморфной функции (C++):

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

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

Вызов функции внутри другой функции с передачей локальной переменной по ссылке - C++
Столкнулся с очень с интересной проблемой. Можно ли так делать? #include &lt;iostream&gt; using std::cout; void f(const int &amp;ref){...

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

Вызов функции в параметре другой функции - C++
программа: #include &lt;iostream&gt; using namespace std; struct E { E() {} }; void f(const E&amp; e)

Вызов функции в возврате значения функции - C++
Есть функция: int function1(a) { ...... return function2(function1(b),function1(c)); } Как работает такая хитрая система?

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

попробуйте void bar (A& a)
0
hoggy
6795 / 2981 / 512
Регистрация: 15.11.2014
Сообщений: 6,732
Завершенные тесты: 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 / 5
Регистрация: 04.06.2017
Сообщений: 99
24.06.2017, 18:34 #4
thormodred, потому что у тебя класс В является производным от класса А. Конструкторы и деструкторы вызываются следующим образом: конструктор базового класса (А), конструктор производного класса (В), деструктор В, деструктор А.
0
rikimaru2013
C++ Game Dev
2468 / 1137 / 240
Регистрация: 30.11.2013
Сообщений: 3,700
24.06.2017, 18:41 #5
savenkodenys, очень полезная информация, а к вопросу, она тут причём? От себя добавлю, что Меркурий первая планета к солнцу. Кто еще знает, что не по теме?)
0
Antikl
с++
204 / 200 / 56
Регистрация: 15.07.2015
Сообщений: 1,060
Завершенные тесты: 6
24.06.2017, 18:44 #6
а вы знали что планета земля по счету 3-я
0
savenkodenys
11 / 11 / 5
Регистрация: 04.06.2017
Сообщений: 99
24.06.2017, 18:45 #7
rikimaru2013,
Цитата Сообщение от thormodred Посмотреть сообщение
Никак не могу понять, почему данная программа все же выводит "А". Не мог бы кто-нибудь объяснить?
0
Antikl
с++
204 / 200 / 56
Регистрация: 15.07.2015
Сообщений: 1,060
Завершенные тесты: 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
Пришел
Эксперт CЭксперт С++
13734 / 7813 / 888
Регистрация: 27.09.2012
Сообщений: 19,196
Записей в блоге: 3
Завершенные тесты: 1
24.06.2017, 18:52 #9
Цитата Сообщение от savenkodenys Посмотреть сообщение
Конструкторы и деструкторы вызываются следующим образом
Немного не так. Вызывается сначала конструктор производного и уже оттуда вызываются конструкторы базовых классов.
Порядок вызова конструкторов
0
Antikl
с++
204 / 200 / 56
Регистрация: 15.07.2015
Сообщений: 1,060
Завершенные тесты: 6
24.06.2017, 18:52 #10
вам уже написали что если так A a то создается копия объекта а так по ссылке A&a
0
hoggy
6795 / 2981 / 512
Регистрация: 15.11.2014
Сообщений: 6,732
Завершенные тесты: 1
24.06.2017, 19:07 #11
Цитата Сообщение от savenkodenys Посмотреть сообщение
rikimaru2013,
Сообщение от thormodred
Никак не могу понять, почему данная программа все же выводит "А". Не мог бы кто-нибудь объяснить?
а в килобайте не всегда 1024 байта.

Добавлено через 32 секунды
Цитата Сообщение от Antikl Посмотреть сообщение
а вы знали что планета земля по счету 3-я
вот теперь я точно понял,
почему там класс А печатаеццо.
0
Antikl
с++
204 / 200 / 56
Регистрация: 15.07.2015
Сообщений: 1,060
Завершенные тесты: 6
24.06.2017, 19:11 #12
Цитата Сообщение от hoggy Посмотреть сообщение
почему там класс А печатаеццо.
0
rikimaru2013
C++ Game Dev
2468 / 1137 / 240
Регистрация: 30.11.2013
Сообщений: 3,700
24.06.2017, 19:23 #13
Цитата Сообщение от Croessmah Посмотреть сообщение
Немного не так. Вызывается сначала конструктор производного и уже оттуда вызываются конструкторы базовых классов.
Вы не путаете список инициализации производного и сам конструктор производного? Вызов всегда подразумевал вход в тело функции, а там входом и не пахнет
0
Croessmah
Пришел
Эксперт CЭксперт С++
13734 / 7813 / 888
Регистрация: 27.09.2012
Сообщений: 19,196
Записей в блоге: 3
Завершенные тесты: 1
25.06.2017, 09:09 #14
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Вызов всегда подразумевал вход в тело функции, а там входом и не пахнет
Вызов предполагает вызов, а куда там пошло - это уже не его задача.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Вы не путаете список инициализации производного и сам конструктор производного?
А что, у нас список инициализации не в конструкторе, а в сферическом вакууме?
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4009 / 2232 / 557
Регистрация: 18.10.2014
Сообщений: 3,852
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
Привет! Вот еще темы с ответами:

вызов функции из под функции - C++
Добрый вечер. Такая ситуация: есть функция, назовем ее MainThreadFunc. Как можно сделать так, чтобы любая другая функция, которую я напишу,...

Вызов функции. - C++
Здрасти, у меня есть функция вычесления суммы цифр числа int sum_digit(int x) { int sum=0; while (x!=0){ ...

Вызов функции - C++
#include &quot;stdafx.h&quot; #include &lt;locale&gt; #include &lt;iostream&gt; using namespace std; class Bankomat { public: Bankomat(){}; ...

Вызов функции - C++
Здравствуйте! Не могу вызвать функцию, объясните причину. template &lt;typename T&gt; void Calc_etalon (QDir &amp; DirTxt) { ...


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

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

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