Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345

Виртуальные функции

13.07.2013, 16:39. Показов 903. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Какие происходят изменения, когда в классе объявляем одну или несколько функций виртуальными?

Вот, например, если в SuperClass перед функцией Show() написать слово virtual, то что произойдет?

C++
1
2
3
4
5
6
7
8
9
class SuperClass
{
public:
    SuperClass(int n)   { value = n; }
    void Show()             { cout << value << endl; }
 
private:
    int value;
};
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.07.2013, 16:39
Ответы с готовыми решениями:

Виртуальные и чисто виртуальные функции
Чем они отличаются?? если можно, с примерами. И как из виртуальной функции сделать чисто виртуальную? #include &lt;iostream&gt; using...

Виртуальные функции
Подскажите пожалуйста, как передать переменную из одной виртуальной функции в другую. Вот код программы работает правильно, но в остальных...

Виртуальные функции
Создать базовый класс «работник больницы» и производные классы «медсестра», «хирург». Выведите на экран возраст и название должности. ...

9
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
13.07.2013, 16:49
Сравните два кода и результаты их работы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
struct Foo
{
    virtual void func() { std::cout << "Foo::func()\n"; };
};
 
struct Derived: public Foo
{
    virtual void func() { std::cout << "Derived::func()\n"; };
};
 
int main()
{
    Foo *a = new Derived;
    a->func();
    return 0;
}
Derived::func()
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
struct Foo
{
    void func() { std::cout << "Foo::func()\n"; };
};
 
struct Derived: public Foo
{
    void func() { std::cout << "Derived::func()\n"; };
};
 
int main()
{
    Foo *a = new Derived;
    a->func();
    return 0;
}
Foo::func()
Таким образом, virtual перед функций заставляет вызывать ее "правильную версию".
1
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
13.07.2013, 17:05  [ТС]
Olivеr, А вот про таблицы виртуальных методов ничего не знаете? Я слышал, что они создаются в таких классах, но что именно из себя представляют, не знаю. Где находится эта таблица и можно ли ее посмотреть?
0
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
13.07.2013, 17:20
BigLow, слышал но не углублялся. Думаю, что она состоит из какого-то рода отсылок к членам класса.
Посмотреть на эту таблицу в явном виде вряд ли можно, но думаю если сделать дамп процесса, то можно что-то найти. Хотя кто его знает, может она создаеться во время компиляции...
1
 Аватар для Мимино
191 / 161 / 35
Регистрация: 22.05.2013
Сообщений: 455
Записей в блоге: 1
13.07.2013, 18:04
Цитата Сообщение от BigLow Посмотреть сообщение
А вот про таблицы виртуальных методов ничего не знаете? Я слышал, что они создаются в таких классах, но что именно из себя представляют, не знаю. Где находится эта таблица и можно ли ее посмотреть?
Таблицы виртуальных методов Вы нигде не посмотрите. Они создаются в классах, в которых есть виртуальные функции-элементы. Служат они для того, чтобы при вызове виртуального метода компилятор знал, какой именно вариант виртуальной функции вызывать. Почитайте информацию о полиморфизме, там найдете ответы на Ваши вопросы.
1
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
13.07.2013, 18:08
В таблице виртуальных функций находятся указатели на соответствующие методы класса.
1
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
13.07.2013, 18:14
Цитата Сообщение от Мимино Посмотреть сообщение
Таблицы виртуальных методов Вы нигде не посмотрите.
В отладчике, не?
0
 Аватар для Мимино
191 / 161 / 35
Регистрация: 22.05.2013
Сообщений: 455
Записей в блоге: 1
13.07.2013, 18:26
Цитата Сообщение от 0x10 Посмотреть сообщение
В отладчике, не?
Да, но зачем ему это сейчас? Только кашу в голове развести.
BigLow,
Вот неплохая тема Таблица виртуальных функций
1
 Аватар для BumerangSP
4311 / 1423 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
13.07.2013, 18:35
Ключевое слово "virtual" говорит компилятору, что вместо раннего связывания нужно использовать позднее. Что такое связывание, можете погуглить. Вкратце это сопоставление вызова функции с телом. Сначала создается таблица виртуальных функций (некий массив указателей), далее в порядке, объявленном в базовом классе, в таблицу заносятся адреса соответствующих функций (виртуальных, для каждого класса переопределенных, либо базового). Далее скрытый член класса (указатель) VPTR инициализируется начальным адресом этой таблицы. Он также создается в классах, где есть хотя бы одна виртуальная функция. Инициализация происходит соответственно в конструкторе. Ну и далее во время работы программы компилятор, зная порядок объявления адресов в таблице, вызывает функцию просто смещаясь к соответствующей ячейке. Разные компиляторы могут реализовывать "виртуальность" по-своему.
1
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
13.07.2013, 19:38  [ТС]
Всем спасибо за объяснения и за ссылки. Буду разбираться что и как
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.07.2013, 19:38
Помогаю со студенческими работами здесь

виртуальные функции
C++ подскажите пожалуста на словах код писать ненадо. как преопределить функцию virtual Print(). Создать абстрактный базовый класс...

Виртуальные функции
Пытаюсь понять что это такое но не понимаю. Может есть какие то болие понятные примеры , а то то что я смотрел не дало результата. ...

Виртуальные функции
Здравствуйте,уважаемые посетители форума.Пишу программу созданию фигур и их перемещению на экране использую виртуальные функции.И...

виртуальные функции
интересует 2 вопроса:1)Какими элементами могут отличаться экземпляры одной виртуальной функции, находящиеся в разных производных...

Виртуальные функции
Разработать программу с использованием наследования классов, реализующую классы: Земноводное(ареал обитания)-&gt;Крокодил(род, длина,...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru