![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 20.06.2008
Сообщений: 125
|
![]()
Подскажите, чем отличаются вот эти два примера? А конкретно что творится в их таблицах виртуальных методов.
Пример №1: Код:
Код:
Код:
|
![]() |
![]() |
![]() |
#2 |
Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933
|
![]()
Если перегружаемая функция в базовом классе виртуальная, то она будет виртуальной и в производном. Помечать её виртуальной явно или нет, ничего от этого не изменится
Последний раз редактировалось netrino; 26.06.2010 в 05:35. |
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 06.12.2008
Сообщений: 613
|
![]() Код:
Посмотрите пример, который выше, а потом пример, который ниже. Отличаются они только тем, что в нижнем примере в базовом классе есть спецификатор virtual. И он меняет суть дела при "перенастройке" базового класса на производный. В случае работы классов самих от себя - они будут использовать свои функции, но если базовый класс настроить на класс производный (путем "подмены" указателей, кароче тупо присвоения), то решающую роль играет слово virtual Посмотрите. После присвоения к указателю класса A указателя класса B, сама реализация указателя осталась неизменной - он до сих пор типа A (об этом говорит, например, количество полей, используемых в классе - в производном их 2, а в базовом их 1, вот и получается, что у нас 1 поле), но попробуйте вызвать функцию print Если базовый с virtual - то вызовите функцию производного класса, то есть того класса, чей указатель взяли (функция предка как бы "невидима" из производного класса, она как бы "виртуальная", зато прекрасно видима функция производного класса) Если без virtual - то вновь вызовите функцию базового класса (тут функция базового класса видима, а так как мы есть тип А, то вызовим свой "видимый нами" метод ) Такая реализация позволяет ходить базовому классу по производным, и не переживать о том, что будет вызвана его старая базовая функция, а вызываться будут именно функции потомка, то есть в коем он сейчас находится Код:
Последний раз редактировалось capta1n; 26.06.2010 в 04:58. |
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 20.06.2008
Сообщений: 125
|
![]()
netrino, смущает лишь слово "по-идее"
![]() |
![]() |
![]() |
![]() |
#5 |
Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933
|
![]() |
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 20.06.2008
Сообщений: 125
|
![]() |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Виртуальные системы. | jojahti | Софт | 12 | 27.01.2010 14:54 |
Виртуальные функции | bigory | Помощь студентам | 2 | 06.06.2009 22:44 |
НАСЛЕДОВАНИЕ И ВИРТУАЛЬНЫЕ ФУНКЦИИ С++ | ermac52 | Помощь студентам | 1 | 05.06.2009 11:03 |
Полиморфизм и виртуальные методы | Викдон | Общие вопросы Delphi | 1 | 02.02.2009 04:40 |
Виртуальные машины! | Marsik | Софт | 17 | 23.04.2008 20:33 |