Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> блокировка публичных методов базового класса 
:(
    Опции темы
Andrej23
Дата 2.8.2011, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 3.11.2006

Репутация: нет
Всего: нет



Доброго времени суток.

собственно сабж.

Создал базовый класс, производный класс и в производном классе хочу заблокировать часть методов базового класса.

Подскажите пожалуйста как это можно сделать?

-------------
да, забыл: это публичные методы базового класса

Это сообщение отредактировал(а) Andrej23 - 2.8.2011, 14:19
PM MAIL   Вверх
asmdzen
Дата 2.8.2011, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



не наследуй от базового а сделай его членом своего производного класса, в производном уже пиши только те функции которые тебе нужны и в них делегируй запрос функциям базового.
Код

class CBase{
public:
    int GetX()const{ return _x;}
    void SetX(int x){_x = x;}
private:
   int _x;
};

class CChild{
public:
    int GetX()const{ return _base.GetX();}
private:
   CBase _base;
};

PM MAIL   Вверх
bsa
Дата 2.8.2011, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



в продолжение сказанного asmdzen: ... иначе доступ к методам базового можно будет получить так: ((Base&)derived).baseMethod(); И ты можешь хоть в лепешку расшибиться, но этого отменить не получится.
Так что, только агрегация (то что предложил asmdzen).
 
PM   Вверх
Andrej23
Дата 2.8.2011, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 3.11.2006

Репутация: нет
Всего: нет



Ого.. здорово. 

Спасибо smile


-------
Но мне сейчас желательно наследовать из базового класса кучу всего (чтобы не плодить много похожих классов) и чтобы не забыть что некоторые методы для этого производного класса в принципе нельзя выполнять и понадобилась блокировка некоторых методов базового класса. Чтобы я не перепутал в случае чего.

Это сообщение отредактировал(а) Andrej23 - 2.8.2011, 16:07
PM MAIL   Вверх
bsa
Дата 2.8.2011, 17:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Andrej23 @  2.8.2011,  15:56 Найти цитируемый пост)
Но мне сейчас желательно наследовать из базового класса кучу всего (чтобы не плодить много похожих классов) и чтобы не забыть что некоторые методы для этого производного класса в принципе нельзя выполнять и понадобилась блокировка некоторых методов базового класса. Чтобы я не перепутал в случае чего.

значит необходимо сменить архитектуру программы. Потому что классы-наследники ТОЛЬКО РАСШИРЯЮТ функционал базового класса. Если сам не можешь это сделать, выкладывай задачу - поможем.
PM   Вверх
spyswamp
Дата 2.8.2011, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

Репутация: 1
Всего: 7



Можно поработать над перекрытием видимости, объявив в derived-классе функции с такими же именами, но ничего не делающие. Это, конечно, в случае, если ты хочешь "прятать" невиртуальные функции. Однако, такой подход очень извращенческий, и должен быть обоснованным на 100500%.
Но лично я за использование композиции в этом случае, как и asmdzen.

Добавлено @ 17:58
И, да, само-собой, если сделают так, как сказали выше
Цитата

 ((Base&)derived).baseMethod();

, то ничего не выйдет. smile Хоть убейся.

Это сообщение отредактировал(а) spyswamp - 2.8.2011, 17:59


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
Andrej23
Дата 2.8.2011, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 3.11.2006

Репутация: нет
Всего: нет



Спасибо всем.

попробую сделать как сказал asmdzen. если что, тогда уж действительно буду структуру классов перетряхивать.

Это сообщение отредактировал(а) Andrej23 - 2.8.2011, 18:33
PM MAIL   Вверх
xvr
Дата 3.8.2011, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Наследовать базовый класс как private, и открыть доступ к нужным методам через using
Код

class A {
public:
 void funca();
 void funcb();
};

class B : private A {
public:
 using A::funca;
};


int main()
{
 B b;
 b.funca(); // Ok
 b.funcb(); // Error
 return 0;
}



Но лучше так не делать!  smile 

PM MAIL   Вверх
bsa
Дата 3.8.2011, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(xvr @  3.8.2011,  15:06 Найти цитируемый пост)
Но лучше так не делать! 

 smile 
PM   Вверх
asmdzen
Дата 3.8.2011, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(xvr @  3.8.2011,  15:06 Найти цитируемый пост)
Но лучше так не делать!

почему, чем это чревато?
PM MAIL   Вверх
xvr
Дата 3.8.2011, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(asmdzen @ 3.8.2011,  18:11)
Цитата(xvr @  3.8.2011,  15:06 Найти цитируемый пост)
Но лучше так не делать!

почему, чем это чревато?

Это признак неправильного проектирования программы. Потому что
Цитата

классы-наследники ТОЛЬКО РАСШИРЯЮТ функционал базового класса.

Ну и в чисто практическом плане придется писать много using, если надо именно закрыть несколько мемберов, а не открыть несколько
Ну и при добавлении новых мемберов в базовый класс придется дописывать новые using

PM MAIL   Вверх
mes
Дата 3.8.2011, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(asmdzen @  3.8.2011,  17:11 Найти цитируемый пост)
почему, чем это чревато? 

трудноотслеживаемыми ошибками..


--------------------
PM MAIL WWW   Вверх
asmdzen
Дата 3.8.2011, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(xvr @  3.8.2011,  20:42 Найти цитируемый пост)
при добавлении новых мемберов в базовый класс придется дописывать новые using

по мне так легче писать using чем целый мембер для перенаправления запроса )
но раз уж это чревато
Цитата(mes @  3.8.2011,  21:28 Найти цитируемый пост)
трудноотслеживаемыми ошибками.. 

верю наслово  smile 
а трюк с указателем на базовый класс прокатит в случае с приватным наследованием?
PM MAIL   Вверх
mes
Дата 3.8.2011, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(asmdzen @  3.8.2011,  20:35 Найти цитируемый пост)
а трюк прокатит ?

 smile

Добавлено через 3 минуты и 10 секунд
Цитата(spyswamp @  2.8.2011,  16:56 Найти цитируемый пост)
Но лично я за использование композиции в этом случае,

Цитата(spyswamp @  2.8.2011,  16:56 Найти цитируемый пост)
, то ничего не выйдет.  Хоть убейся.

эх.. не верите Вы в С++.. он и не на такие пакости способен smile


--------------------
PM MAIL WWW   Вверх
spyswamp
Дата 4.8.2011, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

Репутация: 1
Всего: 7



mes, это уже "хаки" называется.  smile 


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0576 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.