Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для hepr
63 / 35 / 13
Регистрация: 21.10.2010
Сообщений: 538

Вызов виртуальной функции

21.02.2012, 21:02. Показов 2440. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
using namespace std;
 
class A{
public:
    virtual void doIt() {cout << "1";}
};
 
class B : public A{
public:
    virtual void doIt() {cout << "2";}
};
 
 
int main()
{
    A * obj = new B;
    obj->doIt();
    system("pause");
    return 0;
}
Почему выведет 2, а не 1, ведь базовый класс A и я вызываю виртуальную функцию?
Заранее спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.02.2012, 21:02
Ответы с готовыми решениями:

Вызов виртуальной функции по указателю
Суть в том, что преподаватель дал задание на защиту курсовой: вызов по указателю виртуальной функции из ТВР, искал в интернете, наткнулся...

Вызов виртуальной функции по нулевому указателю
struct A { int sum1(int a, int b) { return a+b; } virtual int sum2(int a, int b) { return a+b; } }; int main() { ...

Не работает вызов виртуальной функции из класса потомка
Есть код: #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;list&gt; #include &lt;algorithm&gt; #include &lt;string&gt; #include &lt;sstream&gt; ...

12
35 / 35 / 8
Регистрация: 11.02.2012
Сообщений: 105
21.02.2012, 21:08
Здесь срабатывает что-то типа позднего или раннего связывания.
Участок памяти "B" ссылается на собственную функцию

Правильно работает
1
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
21.02.2012, 21:11
Для этого виртуальные функции и созданы. Пожалуйста, прочитайте соответствующее руководство.

В кратце, простыми словами.

У каждого созданного объекта(!) класса есть таблица, в которой записано, какие виртуальные функции вызывать для этого объекта.

При вызове виртуальной функции эта таблица будет просмотрена и взята нужная функция.

Когда выполняется "A *obj = new B;" у объекта типа A будет таблица виртуальных функций типа B.

Поэтому будет вызвана виртуальная функция объекта B.
1
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
21.02.2012, 21:20
Цитата Сообщение от hepr Посмотреть сообщение
Почему выведет 2, а не 1, ведь базовый класс A и я вызываю виртуальную функцию?
Заранее спасибо!
Прочитайте еще раз, что такое виртуальная функция.
1
 Аватар для hepr
63 / 35 / 13
Регистрация: 21.10.2010
Сообщений: 538
21.02.2012, 22:02  [ТС]
Спасибо, понял, где я был не прав
+ Еще один вопрос про это если позволите:
C++
1
2
3
4
5
6
7
8
9
class A{
public:
    virtual void doIt() {cout << "1";}
};
 
class B : public A{
public:
    void doIt() {cout << "2";}
};
Функция doIt() стала невиртуальной?
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
22.02.2012, 00:05
Цитата Сообщение от hepr Посмотреть сообщение
Функция doIt() стала невиртуальной?
Нет. У всех классов по иерархии от класса А метод doIt будет виртуальным.
Т.е. если C наследует B, то метод doIt класса C тоже будет виртуальным.
1
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
22.02.2012, 00:11
заодно уж если сюда залез прочитай что есть чисто виртуальная функция
C++
1
virtual void doIt()=0;
и что такое абстрактный класс
1
 Аватар для hepr
63 / 35 / 13
Регистрация: 21.10.2010
Сообщений: 538
22.02.2012, 13:17  [ТС]
Цитата Сообщение от Chelioss Посмотреть сообщение
Нет. У всех классов по иерархии от класса А метод doIt будет виртуальным.
Т.е. если C наследует B, то метод doIt класса C тоже будет виртуальным.
Тогда почему если я напишу в классе С этот метод без virtual, то все нормально скомпилируется?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
22.02.2012, 15:36
hepr, потому что виртуальность сохраняется независимо от наличия или отсутствия модификатора. Можно писать, можно не писать. Я предпочитаю писать, ибо так нагляднее.
2
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
22.02.2012, 17:05
Цитата Сообщение от hepr Посмотреть сообщение
Тогда почему если я напишу в классе С этот метод без virtual, то все нормально скомпилируется?
Потому что виртуальными они становятся автоматом!
1
6 / 6 / 2
Регистрация: 12.02.2012
Сообщений: 224
16.03.2012, 13:35
ну так а верное решение где?
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
16.03.2012, 17:15
Цитата Сообщение от RASHFor Посмотреть сообщение
ну так а верное решение где?
Верное решение чего?
0
6 / 6 / 2
Регистрация: 12.02.2012
Сообщений: 224
16.03.2012, 18:00
да,действительно туплю.
Думал,что вопрос заключается в поиске решения по выводу первым-1цы. Не хотел разбираться.Но к этому рещению пришёл сам очень быстро.спасибо,за понимание.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.03.2012, 18:00
Помогаю со студенческими работами здесь

Вызов виртуальной функции через указатель на базовый класс
Всем привет! Помогите пожалуйста разобраться с вызовом виртуальной функции в программе. В моей программе требуется организовать класс...

Вызов виртуальной функции vs несколько dynamic_cast подряд: что быстрее?
Нужно максимально оптимизировать программу вот и пал выбор: лучше сделать чтобы вызывались виртуальные функции или же чтобы было четыре...

Вызов виртуальной функции, определённой в дочернем классе, через указатель на базовый класс
Как вызвать виртуальную функцию, определённую в дочернем классе, через указатель на базовый класс? Совершенно точно известно, что на...

вызов виртуальной функции С++ вылетает в HardFault_Handler
Собственно все дело в CooCox IDE (версия 1.7.8) (в версии 2Beta тоже самое), тк в Кейле этот код компилится и работает. Вопрос: кто как...

Переопределение виртуальной функции
Всем доброй ночи :) Есть базовый абстрактный класс и два производных класса (А и В), в которых я пытяюсь переопределить виртуальную...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru