![]() |
|
Модераторы: bsa |
![]()
|
|
| Andrej23 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 3.11.2006 Репутация: нет Всего: нет |
Доброго времени суток.
собственно сабж. Создал базовый класс, производный класс и в производном классе хочу заблокировать часть методов базового класса. Подскажите пожалуйста как это можно сделать? ------------- да, забыл: это публичные методы базового класса Это сообщение отредактировал(а) Andrej23 - 2.8.2011, 14:19 |
|||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
не наследуй от базового а сделай его членом своего производного класса, в производном уже пиши только те функции которые тебе нужны и в них делегируй запрос функциям базового.
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
в продолжение сказанного asmdzen: ... иначе доступ к методам базового можно будет получить так: ((Base&)derived).baseMethod(); И ты можешь хоть в лепешку расшибиться, но этого отменить не получится.
Так что, только агрегация (то что предложил asmdzen). |
|||
|
||||
| Andrej23 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 3.11.2006 Репутация: нет Всего: нет |
Ого.. здорово.
Спасибо ------- Но мне сейчас желательно наследовать из базового класса кучу всего (чтобы не плодить много похожих классов) и чтобы не забыть что некоторые методы для этого производного класса в принципе нельзя выполнять и понадобилась блокировка некоторых методов базового класса. Чтобы я не перепутал в случае чего. Это сообщение отредактировал(а) Andrej23 - 2.8.2011, 16:07 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
значит необходимо сменить архитектуру программы. Потому что классы-наследники ТОЛЬКО РАСШИРЯЮТ функционал базового класса. Если сам не можешь это сделать, выкладывай задачу - поможем. |
|||
|
||||
| spyswamp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 349 Регистрация: 18.8.2006 Репутация: 1 Всего: 7 |
Можно поработать над перекрытием видимости, объявив в derived-классе функции с такими же именами, но ничего не делающие. Это, конечно, в случае, если ты хочешь "прятать" невиртуальные функции. Однако, такой подход очень извращенческий, и должен быть обоснованным на 100500%.
Но лично я за использование композиции в этом случае, как и asmdzen. Добавлено @ 17:58 И, да, само-собой, если сделают так, как сказали выше
, то ничего не выйдет. Это сообщение отредактировал(а) spyswamp - 2.8.2011, 17:59 -------------------- - why you call it beta? - cuz it's betta then nothin' |
|||
|
||||
| Andrej23 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 3.11.2006 Репутация: нет Всего: нет |
Спасибо всем.
попробую сделать как сказал asmdzen. если что, тогда уж действительно буду структуру классов перетряхивать. Это сообщение отредактировал(а) Andrej23 - 2.8.2011, 18:33 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Наследовать базовый класс как private, и открыть доступ к нужным методам через using
Но лучше так не делать! |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
||||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
||||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Это признак неправильного проектирования программы. Потому что
Ну и в чисто практическом плане придется писать много using, если надо именно закрыть несколько мемберов, а не открыть несколько Ну и при добавлении новых мемберов в базовый класс придется дописывать новые using |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Добавлено через 3 минуты и 10 секунд эх.. не верите Вы в С++.. он и не на такие пакости способен |
|||
|
||||
| spyswamp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 349 Регистрация: 18.8.2006 Репутация: 1 Всего: 7 |
mes, это уже "хаки" называется.
-------------------- - why you call it beta? - cuz it's betta then nothin' |
|||
|
||||
![]()
|
| Правила форума "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. |