![]() |
|
Модераторы: bsa |
![]()
|
|
| zim22 |
|
||||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
В классе Set я указываю, что функция head является закрытой.
Тем не менее функция listehead получает к ней доступ... Я считаю, что это неправильно, т.к. нарушается инкапсуляция класса Set. Ведь мы не имеем права вызывать в клиентском коде private функции... Вопрос: где я протупил?
|
||||
|
|||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
А вот так?
|
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
я хотел полиморфное поведение. Для этого и передаю в функцию listhead ссылку на базовый класс. Хорошо, изменим класс Set так, чтобы явно переопределить вирт.функцию. И она всё-равно вызывается...
Это сообщение отредактировал(а) zim22 - 30.4.2009, 09:53 |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
zim22,
Но вызываете то вы функцию по указателю базового класса, а в базовом классе функция открыта. |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 7 Всего: 60 |
||||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
В базовом - она открыта, да. Но вызывается в конечном счёте функция не базового класса, а производного. А в производном классе функция находится в разделе private... Т.е. я правильно понимаю: с какой меткой доступа функция была объявлена в базовом классе - с такой меткой она и будет вызываться в производных, независимо от того, в каком разделе(public, private) производного класса она находится? Это сообщение отредактировал(а) zim22 - 30.4.2009, 10:00 |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
zim22
Ну для начала стоит понять одну вещь Проверка идет компайл тайм, какая функция на самом деле будет вызвана - компайл тайм неизвестно так как функция виртуальная. И второе, такое поведение вполне нормально и с точки зрения С++ и с точки зрения логики. |
|||
|
||||
| zim22 |
|
||||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
c этим согласен. всё логично.
с точки зрения моей логики это не нормально: какое право имеет сторонняя функция, не объявленная как firend, вызывать private функции класса... |
||||
|
|||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 7 Всего: 60 |
нет конечно, неправильно ты понимаешь... права доступа определяются по типу переменной. У тебя тип List. Вот по его объявлению и определяется что для переменной l открыто , а что нет. Если тип будет Set, то тогда по нему и будет определяться |
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
zim22
вот тут тоже вызывается. Это нелогично? Это сообщение отредактировал(а) azesmcar - 30.4.2009, 10:08 |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Интерфейс же базового класса не изменился от того, что Вы определили производный.
1. Для функции List::head в классе Set Вы переопределили лишь ее реализацию 2. Для класса Set определили такой интерфейс в котором функция Set::head () приватна. Первое со вторым никак не связано и не пересекается. Это сообщение отредактировал(а) mes - 30.4.2009, 10:09 |
|||
|
||||
| Fazil6 |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 7 Всего: 60 |
странная у тебя логика. Ты сказал, что у тебя
Где ты тут видишь вызов private функции класса? l - это ссылка на List вне зависимости что ты туда на самом деле передал. Как компилятор должен по твоему понять закрыта или нет функция? |
||||
|
|||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
логично. т.к. внутри класса мы имеем доступ к private функциям. в моём примере функция listhead объявлена вне класса. и никаких прав на доступ к private переменным/функциям класса она не имеет. заглянуть в интерфейс класса List и посмотреть метку доступа функции head. она там public. значит всё ОК, можно компилить. Это сообщение отредактировал(а) zim22 - 30.4.2009, 10:16 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
zim22
![]() Добавлено @ 10:19 Переведу на всякий случай Доступ проверяется в момент вызова, используя тип который был использован для вызова. Доступ для функции-члена в классе в котором вызываемая функция была определена - в общем случае неизвестна. Это сообщение отредактировал(а) azesmcar - 30.4.2009, 10:29 |
|||
|
||||
![]()
|
| Правила форума "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. |