поясните по private наследованию
От: Srv  
Дата: 21.07.07 08:23
Оценка:
Всем привет!
Не пойму зачем оно нужно и как его пользовать, вроде примеры смотрел у страуструпа, но их мало и они не ясны.... поясните кто может на конкретных вещах.
Спасибо!
Re: поясните по private наследованию
От: den123 Израиль http://den123.smugmug.com
Дата: 21.07.07 08:33
Оценка:
Здравствуйте, Srv, Вы писали:

Srv>Всем привет!

Srv>Не пойму зачем оно нужно и как его пользовать, вроде примеры смотрел у страуструпа, но их мало и они не ясны.... поясните кто может на конкретных вещах.
Srv>Спасибо!
Смею предположить, что модификатор private запрещает пользоваться переменной (или функцией) вне класса. Даже наследникам нельзя.
WBR — Yuriy
Re: поясните по private наследованию
От: remark Россия http://www.1024cores.net/
Дата: 21.07.07 08:40
Оценка:
Здравствуйте, Srv, Вы писали:

Srv>Всем привет!

Srv>Не пойму зачем оно нужно и как его пользовать, вроде примеры смотрел у страуструпа, но их мало и они не ясны.... поясните кто может на конкретных вещах.
Srv>Спасибо!

В общем случае его лучше и не использовать.

Зачастую (если оно используется для "наследования реализации") его можно заменить на инкапсуляцию:

class my : private std::vector<int>
{
};


заменяем на:

class my
{
  std::vector<int> v;
};


Что по рекомендациям ведущих сабаководов является лучшим вариантом.




Единственный разумный вариант, который приходит в голову, — это реализация интерфейса. Да, именно реализация интерфейса. Некоторые считают, что private наследованием нельзя реализовать интерфейс, но, как бы абсурдно это ни звучало, в С++ это не так.
Вот пример:

/** Интерфейс некого сервиса
 */
struct IService
{
  virtual void do_something() = 0;
};

/** Регистр сервисов
 */
struct IServiceRegister
{
  virtual void register(IService* service) = 0;
};

/** Получение экземпляра регистра сервисов
 */
IServiceRegister& getServiceRegister();

/** Вот наш конкретный сервис, который реализует IService,
 *  но тем менее наследуется как private
 */
class MyService : private IService
{
  // ...

  void init()
  {
    // Здесь MyService законно приводится к IService
    getServiceRegister().register(this);
  }
};




1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: поясните по private наследованию
От: dip_2000 Россия  
Дата: 21.07.07 08:44
Оценка:
Здравствуйте, Srv, Вы писали:

Srv>Всем привет!

Srv>Не пойму зачем оно нужно и как его пользовать, вроде примеры смотрел у страуструпа, но их мало и они не ясны.... поясните кто может на конкретных вещах.
Srv>Спасибо!

Необходимо для полного сокрытия от внешнего мира(в том числе и от возможных наследников), методов и полей класса предка.
Пример — прокси класс(в случае когда мыего реализуем при помощи наследования), его использование должно быть построенно на его собственном интерфейсе, а не на интерфейсе(да же частично) класса предка.
Re[2]: поясните по private наследованию
От: remark Россия http://www.1024cores.net/
Дата: 21.07.07 09:02
Оценка:
Здравствуйте, dip_2000, Вы писали:

_>Здравствуйте, Srv, Вы писали:


Srv>>Всем привет!

Srv>>Не пойму зачем оно нужно и как его пользовать, вроде примеры смотрел у страуструпа, но их мало и они не ясны.... поясните кто может на конкретных вещах.
Srv>>Спасибо!

_>Необходимо для полного сокрытия от внешнего мира(в том числе и от возможных наследников), методов и полей класса предка.

_>Пример — прокси класс(в случае когда мыего реализуем при помощи наследования), его использование должно быть построенно на его собственном интерфейсе, а не на интерфейсе(да же частично) класса предка.

Имо, более разумный вариант здесь — простая агрегация. Здесь нет отношения "is-a", т.к. никто его не "видит".

Единственное обоснование для использования наследования здесь, имо, — желание получить "оптимизацию пустого базового класса" (EBO).


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: поясните по private наследованию
От: dip_2000 Россия  
Дата: 21.07.07 09:20
Оценка:
_>>Необходимо для полного сокрытия от внешнего мира(в том числе и от возможных наследников), методов и полей класса предка.
_>>Пример — прокси класс(в случае когда мыего реализуем при помощи наследования), его использование должно быть построенно на его собственном интерфейсе, а не на интерфейсе(да же частично) класса предка.

R>Имо, более разумный вариант здесь — простая агрегация. Здесь нет отношения "is-a", т.к. никто его не "видит".

R>Единственное обоснование для использования наследования здесь, имо, — желание получить "оптимизацию пустого базового класса" (EBO).
Да я согласен, что следует использовать агрегацию Но закрытое наследование даст почти то же самое
Еще раз: пример приведен неудачный Вырожденый

R>

Re: поясните по private наследованию
От: Quasi  
Дата: 21.07.07 10:47
Оценка: 7 (1)
Здравствуйте, Srv, Вы писали:

Srv>Всем привет!

Srv>Не пойму зачем оно нужно и как его пользовать, вроде примеры смотрел у страуструпа, но их мало и они не ясны.... поясните кто может на конкретных вещах.
Srv>Спасибо!

Например, если нет возможности изменить класс, а нужно получить доступ к защищенным членам, скрывая при этом интерфейс исходного класса.
Re: поясните по private наследованию
От: Smooky Россия  
Дата: 22.07.07 20:08
Оценка:
Здравствуйте, Srv, Вы писали:

Srv>Всем привет!

Srv>Не пойму зачем оно нужно и как его пользовать, вроде примеры смотрел у страуструпа, но их мало и они не ясны.... поясните кто может на конкретных вещах.
Srv>Спасибо!

Вообще я чётко следую тому что пишут такие товарищи как Саттер и нисколько не пожалел. Всем нужно читать!

Вот краткие выжимки из Саттера:

class BasicProtocol
{
public:
BasicProtocol();
virtual ~BasicProtocol();
bool BasicMsgA(/* ... */);
};

class Protocol_1 : public BasicProtocol
{
public:
Protocol_1();
virtual ~Protocol_1();
bool DoMsg_1(/* ... */);
};

class Protocol_2 : public BasicProtocol
{
public:
Protocol_2();
virtual ~Protocol_2();
bool DoMsg_2(/* ... */);
};

Здесь показаны наиболее распространённые ловушки при проектировании ОО взаимоотношений классов. Ситуация описывается типичным отношением, которое в С++ пишется как "реализуется посредством", а читается — как "закрытое наследование". К сожалению, многие программисты ошибочно произносят "открытое наследование" тем самым путая наследование реализации и наследование интерфейса.

Никогда не используйте открытое наследование, за исключением модели ЯВЛЯЕТСЯ и РАБОТАЕТ КАК. Все замещающие функции-члены при этом не должны предъявлять повышенные требования к условиям работы и не должны иметь пониженную функциональность по сравнению с оригиналом.

Кстати, программисты, имеющие обыкновение допускать эту ошибку, обычно в результате строят большие иерархии наследования.

Никогда не используйте открытое наследование дял повторного использования кода (базового класса). Используйте открытое наследование только для того, чтобы быть повторно использованным кодом, полиморфно использующим базовые объекты.

1. BasicProtocol не иметт вирт. функций, значит не предназначен для полиморфного использования.
2. BasicProtocol не имеет защищённых функций и членов, т.е. отсутствует "интерфейс наследования".
3. Наследование не даёт никаких приемуществ.

Открытый интерфейс должен использоваться только в одном случае — для взаимоотношения ЯВЛЯЕТСЯ, подчиняющегося принйипу подстановки Лисков.

При моделировании отношения "реализован посредством" предпочтительно использовать делегирование, а не наследование. Т.е. используйте закрытое наследование только тогда, когда вам требуется доступ к защищённым членам или требуется заместить вирт. функцию.

Вот причины когда требуется закрытое наследование:
1. Требуется замещение виртуальной функции.
2. Требуется доступ к защищённым членам.
3. Требуется содание используемого объекта до другого базового объекта.
4. Требуется совместное использование общего виртуального базового класса или замещение конструктора виртуального базового класса.
5. Получение существенной выгоды от оптимизации пустого базового класса.
6. Требуется "управляемый полиморфизм".
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[2]: поясните по private наследованию
От: dip_2000 Россия  
Дата: 23.07.07 04:59
Оценка:
S>class BasicProtocol
S>{
S>public:
S> BasicProtocol();
S> virtual ~BasicProtocol();
S> bool BasicMsgA(/* ... */);
S>};

S>class Protocol_1 : public BasicProtocol

S>{
S>public:
S> Protocol_1();
S> virtual ~Protocol_1();
S> bool DoMsg_1(/* ... */);
S>};

S>class Protocol_2 : public BasicProtocol

S>{
S>public:
S> Protocol_2();
S> virtual ~Protocol_2();
S> bool DoMsg_2(/* ... */);
S>};

Простите, а где в Вашем примере private наследование ?
Re[3]: поясните по private наследованию
От: Аноним  
Дата: 23.07.07 05:37
Оценка:
да ладно он просто хотел сказать что читает Саттера ( и видимо ничего при этом не понимает, но это видимо и не важно главно читать )
Re[4]: поясните по private наследованию
От: remark Россия http://www.1024cores.net/
Дата: 23.07.07 05:42
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>да ладно он просто хотел сказать что читает Саттера ( и видимо ничего при этом не понимает, но это видимо и не важно главно читать )


Он хотя бы умеет внимательно читать

Здесь показаны наиболее распространённые ловушки при проектировании ОО взаимоотношений классов



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: поясните по private наследованию
От: AKh  
Дата: 23.07.07 06:09
Оценка:
Здравствуйте, Srv, Вы писали:

Srv>Всем привет!

Srv>Не пойму зачем оно нужно и как его пользовать, вроде примеры смотрел у страуструпа, но их мало и они не ясны.... поясните кто может на конкретных вещах.
Srv>Спасибо!

Аналог инкапсуляции. Применяется для использования реализации класса посредством другого, используя переопределение вирутуальных функций.


class Release {
   protectd:
      virtual void some_work() {};
   public:
      void work() {
         //делаем разную работу
         some_work();//выполняем какую-то операцию в процессе работы
         //еще делаем работу
      };
};

class MyClass :private Release {
   protected:
      virtual void some_work() {};

   public:
      void doWork() {
          work();
      };
};
Re: поясните по private наследованию
От: Srv  
Дата: 28.07.07 07:04
Оценка:
Ну понял зачем это нужно на практике
Очень даже удобная вещь... чтобы не дать пользоваться унаследованными через private методами родителя...
Интересно почему в основном так не делают, а делают has a.
Re: поясните по private наследованию
От: Аноним  
Дата: 29.07.07 19:05
Оценка:
Во первых, при реализации интерфейса для внутренних нужд, чтобы при этом никто случайно не дернул наш класс за эти методы, кроме того, кому был дан интерфейс
Т.е.
class IListener
{
public:
    virtual void OnEvent() = 0;
};

class EventMonitor
{
public:
    void AddListener(IListener *l);
};

class EventProcessor : private IListener
{
private:
    EventMonitor m_event_monitor;
protected:
    virtual void OnEvent()
    {
        printf("OnEvent()\n");
    }
    
public:
    EventProcessor()
    {
        m_event_monitor.AddListener(this);
    }
};


Во вторых, я так иногда делаю вместо аггрегации чисто из философских соображений.
Это когда функционал моего класса по сути реализован в другом, а мне например только преобразовать параметры и отправить в него, а часть методов вообще спрятать.
Re[3]: поясните по private наследованию
От: Smooky Россия  
Дата: 29.07.07 20:25
Оценка: :)
Здравствуйте, dip_2000, Вы писали:


_>Простите, а где в Вашем примере private наследование ?


Надо было до конца дочитать хотя бы:
Вот причины когда требуется закрытое наследование:
1. Требуется замещение виртуальной функции.
2. Требуется доступ к защищённым членам.
3. Требуется содание используемого объекта до другого базового объекта.
4. Требуется совместное использование общего виртуального базового класса или замещение конструктора виртуального базового класса.
5. Получение существенной выгоды от оптимизации пустого базового класса.
6. Требуется "управляемый полиморфизм".

Именно вот этим я и закончил сообщение!!! А вот так звучал вопрос афтара:Не пойму зачем оно нужно и как его пользовать!

ТЕПЕРЬ ПОНЯТНО???!!!
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[4]: поясните по private наследованию
От: Smooky Россия  
Дата: 29.07.07 20:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>да ладно он просто хотел сказать что читает Саттера ( и видимо ничего при этом не понимает, но это видимо и не важно главно читать )


ЧИТАЙ НИЖЕ!
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[5]: поясните по private наследованию
От: Smooky Россия  
Дата: 29.07.07 20:27
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, Аноним, Вы писали:


А>>да ладно он просто хотел сказать что читает Саттера ( и видимо ничего при этом не понимает, но это видимо и не важно главно читать )


R>Он хотя бы умеет внимательно читать


R>

R>Здесь показаны наиболее распространённые ловушки при проектировании ОО взаимоотношений классов


R>


ЧИТАЙ НИЖЕ!
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.