![]() |
|
Модераторы: bsa |
![]()
|
|
| Алексей |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 19.6.2006 Репутация: нет Всего: нет |
То ли я неправильно понял теорию, то ли еще что...
Почему я не могу теперь обратиться к B::fb() через
ведь мой указатель, если я правильно понимаю, сейчас должен указывать на таблицу виртуальных функция класса B. А в ней, благодаря наследованию должно быть 2 функции A::fa() и B::fb(). Или я что-то неправильно понял? |
||||
|
|||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
||||
|
||||
| Алексей |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 19.6.2006 Репутация: нет Всего: нет |
Да, я как раз и прочитал эту статью. Вот теперь перешел к практики и не понимаю, что я делаю не так.
|
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
А как ты хочешь обратиться? это указатель на А, и ему ничего не известно о том что ты наследовал класс А и написал в нем какую-то функцию. немного теории если создать в классе виртуальную функцию, в каждый обьекте класса добавится указатель на виртуальную таблицу. А смысл виртуальных функций (полиморфизма) это вызов функции того обьекта, который был на самом деле создан а не по типу указателя. Например
если сделать функцию виртуальной, то будет вызыватся функция класса B, потому что на самом деле в указателе п лежит обьект типа B. Название твоих функций разные, и тут нет никакого полиморфизма. Если не перекрывать функции - виртуальность функций теряет смысл. Это сообщение отредактировал(а) azesmcar - 24.2.2009, 10:17 |
||||
|
|||||
| Алексей |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 19.6.2006 Репутация: нет Всего: нет |
А, то есть виртуальная функция обязана быть переопределена?
Теперь яснее, но все равно непонятна фраза в вышеупомянутой статье:
Сами классы:
Я думал, что раз вторая таблица "содержит 3 элемента: V::foo(), Vbase::bar(), V::alpha()", то почему бы не обратиться к любому виртуальному методу, даже не объявленному в Vbase. В данном случае это V::alpha() Это сообщение отредактировал(а) Алексей - 24.2.2009, 10:34 |
||||
|
|||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
чистая виртуальна - да(если конечно нужен не абстрактный потомок) Указатель на отца "знает" смещения своих виртуальных ф-ий в vtable, он ничего не знает о новой ф-ии потомка, а значит и не знает смещения ее в таблице. |
|||
|
||||
| Алексей |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 19.6.2006 Репутация: нет Всего: нет |
А, т.е. указатель отца смотрит смещения в своей таблице виртуальных функций и вызывает аналогичные функции из vtable реально созданного потомка, так?
|
|||
|
||||
| azesmcar |
|
||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Ну не то чтобы обязана, просто без этого она бессмысленна. В конце концов ее кто-то должен переопределить.
не стоит так глубоко рассматривать виртуальную таблицу, просто пока знай что при определении хоть одной виртуальной функции в классе, в обьект добавляется 4 байта (т.е. адрес виртуальной таблицы изходя из которой вызывается та функция - которая должна быть вызвана). К тому же это всего лишь стандартная реализация, в С++ стандарте ни слова не сказано о виртуальной таблице, просто программисты нашли один и кстати неплохой способ реализации полиморфизма с помощью виртуальных таблиц и оставили эту тему в покое. Вполне может быть компилятор который работает по другому и не имеет виртуальных таблиц (это теоретически).
нет, тут просто в классе потомке добавлена функция alpha, которую можно переопределить в потомках класса V. т.е. эта функция недоступна по указателю vBase приведу пример чтобы тебе было легче понять что такое полиморфизм и зачем он. Например у нас есть класс человек (human), наследуем от него пару классов (man, woman). Рождаются они одинаково, растут тоже, но мыслят по разному...
тут заодно виден смысл абстрактного класса. Класс человек абстрактный, т.е. мы не знаем как можно реализовать виртуальную функцию для него, потому оставляем тело пустым, и заставляем каждого кто от него наследует - переопределять функцию. А функции born и grow одинаковы для обоих полов, потому пишем их в базовом классе. Добавлено @ 11:24 надеюсь мою шутку не рассмотрят как половую дискриминацию ))) Это сообщение отредактировал(а) azesmcar - 24.2.2009, 11:25 |
||||||||
|
|||||||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |