Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700

А где вы используете private наследование?

30.06.2017, 19:15. Показов 5143. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Насколько я знаю то при приватном наследовании наследник ничего от родительского класса не наследует.
Тогда зачем оно нужно? Ничего же не наследуется.
На мой взгляд это может понадобится если нужно по определенным причинам выдать один тип за другой за счёт базового.
Но хотелось бы узнать мнение более опытных
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.06.2017, 19:15
Ответы с готовыми решениями:

А где вы используете private наследование?
Private наследование позволяет реализовать отношение содержит, т.е. почти то же, что и встроить объект нужного класса, в теории оно...

Private наследование
Добрый вечер, почему приходится подставлять явно ссылку на базовый класс - компилятор скушал - значит знает что внутри класса видно,...

Наследование private
Почему в следующем коде экземпляр класса man вернет 'Hello'? Должен же запретить наследование приватной переменной? Ведет себя так как...

30
Заблокирован
30.06.2017, 19:18
Цитата Сообщение от Undisputed Посмотреть сообщение
На мой взгляд это может понадобится если нужно по определенным причинам выдать один тип за другой за счёт базового.
Как раз с приватным наследованием это не получится.
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
30.06.2017, 19:30
Лучший ответ Сообщение было отмечено Undisputed как решение

Решение

См. Boost.NonCopyable, например.
Это класс, наследуясь от которого, мы запрещаем копирование объекта.
Здесь наследование как раз должно быть приватным, иначе потенциальные
наследники класса могли бы получить доступ к запрещенным функциям...

noncopyable
http://www.boost.org/doc/libs/... yable.html

Добавлено через 15 секунд
См. Boost.NonCopyable, например.
Это класс, наследуясь от которого, мы запрещаем копирование объекта.
Здесь наследование как раз должно быть приватным, иначе потенциальные
наследники класса могли бы получить доступ к запрещенным функциям...

noncopyable
http://www.boost.org/doc/libs/... yable.html
3
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
30.06.2017, 21:23  [ТС]
daun-autist,
Это потому что ничего из базового класса нельзя будет вызвать что либо?
А как насчёт трюков в отношении метапрограммирования?

Убежденный,
Там класс вроде пустой. Запрещение копирования происходит за счёт того что конструктор родительского класса недоступен?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
30.06.2017, 21:46
Для миксинов. Пример см выше -
Цитата Сообщение от Убежденный Посмотреть сообщение
Boost.NonCopyable
1
Заблокирован
30.06.2017, 22:01
Почему здесь не запрещено задавать вопросы, на которые уже есть ответы?

Добавлено через 7 минут
Цитата Сообщение от Undisputed Посмотреть сообщение
Это потому что ничего из базового класса нельзя будет вызвать что либо?
Потому что такое правило, что только public-наследование выражает отношение "является".
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
01.07.2017, 11:42  [ТС]
MrGluck, daun-autist,
Спасибо за помощь

Добавлено через 13 часов 37 минут
Убежденный,
Разобрался вроде. Просто запрещается копирование родительского класса и все, поэтому с помощью конструктора по умолчанию копировать объект не получается(да и создать тоже)...

daun-autist,
А откуда вы взяли такое правило? Ваше утверждение судя по всему не действительно
Потому что такое правило, что только public-наследование выражает отношение "является".
C++
1
2
3
4
5
6
7
8
9
10
11
//g++  5.4.0
 
#include <iostream>
 
class foo{};
class bar : private foo{};
 
int main()
{
    std::cout << std::is_base_of<foo, bar>::value;
}
http://rextester.com/QKM99837
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
01.07.2017, 12:55
Undisputed, выше ссылка на isocpp faq.
Вы ппутаете ООП концепции и C++. Мешаете как хотите их.
Наследование в C++ и "отношения" классов в ООП это как бэ разные вещи.
Одно может наследоваться от другого, но не удовлетворять требованиям "является".
Вы не можете использовать bar так, как будто это foo, т.к. наследование приватное.
Только сам класс bar может работать так, как будто он foo,
но внешний код так уже работать не может, так что никакого is-a здесь нет.

Зато приватное наследование вполне подходит под композицию (has-a).
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
01.07.2017, 13:50  [ТС]
Croessmah
Ну если говорить чисто о терминологии и определениях то да, я с вами полностью согласен.
Под понятием "является" я понимал именно возможность определить наличие родительского класса в дереве наследования независимо от типа наследования.
0
01.07.2017, 21:55

Не по теме:

private-наследование это отношение "содержит", обычно...

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.07.2017, 22:40
Цитата Сообщение от Undisputed Посмотреть сообщение
Но хотелось бы узнать мнение более опытных
нафиг не нужно на практике.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
02.07.2017, 10:41
Плюс еще одно применение private наследования - у базового класса нет виртуального деструктора и мы хотим запретить приводить указатель на дочерний класс к указателю на базовый (чтоб не было проблем с вызовом деструктора). На практике я 1 раз в жизни так делал)
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
02.07.2017, 10:57
Цитата Сообщение от Kastaneda Посмотреть сообщение
Плюс еще одно применение private наследования - у базового класса нет виртуального деструктора и мы хотим запретить приводить указатель на дочерний класс к указателю на базовый
нафига там тогда полиморфизм?
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
02.07.2017, 11:48
Цитата Сообщение от hoggy Посмотреть сообщение
нафига там тогда полиморфизм?
а его там и нет) Просто расширение класса.
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.07.2017, 12:10
Цитата Сообщение от Kastaneda Посмотреть сообщение
Плюс еще одно применение private наследования - у базового класса нет виртуального деструктора и мы хотим запретить приводить указатель на дочерний класс к указателю на базовый (чтоб не было проблем с вызовом деструктора). На практике я 1 раз в жизни так делал)
Чем это лучше обычной композиции?
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
02.07.2017, 12:41  [ТС]
Avazart,
Может же быть так что нам не нужен экземпляр базового класса(а композиция требует этого), и полиморфизм тоже не нужен, но при этом нескольким наследникам требуется функциональность этого базового класса т.к он для них общий.

Например для реализации инкапсуляции часто используются методы setSomething, getSomething и чтоб не повторять эти методы во всех классах где нужен функционал этого Something-a очень даже удобно выделить сеттер и геттер в отдельный класс и наследовать эти методы
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
02.07.2017, 12:41
Цитата Сообщение от Убежденный Посмотреть сообщение
См. Boost.NonCopyable, например.
Это класс, наследуясь от которого, мы запрещаем копирование объекта.
Все же я не понял, для чего тут использовать private наследование, ведь можно самому указать, что копирование класса = delete;
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.07.2017, 12:48
Цитата Сообщение от mat_for_c Посмотреть сообщение
Все же я не понял, для чего тут использовать private наследование, ведь можно самому указать, что копирование класса = delete;
До С++11, не было ...

Не по теме:

И честно говоря мне кажется так нагляднее...

0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
02.07.2017, 12:49  [ТС]
mat_for_c,
Думаю все дело в том что у программистов есть хорошая привычка реализовывать заранее один раз часто используемый функционал и использовать его там где он нужен тем самым создав некий стандарт кодирования и удобство... То есть достаточно просто отнаследоваться от уже готового кода и не писать одно и то же по 100 раз. Да и до с++11 delete для методов вроде и нет.

Думаю как то так... Но посмотрим что скажет Убежденный
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.07.2017, 12:52
Цитата Сообщение от Undisputed Посмотреть сообщение
Думаю все дело в том что у программистов есть хорошая привычка реализовывать заранее один раз часто используемый функционал и использовать его там где он нужен тем самым создав некий стандарт кодирования и удобство...
В идеале это так, на практике это применимо когда решается схожие задачи.
А когда каждый раз новая задача приходится писать новый код, переписывать старый или искать другую библиотеку.

Цитата Сообщение от Undisputed Посмотреть сообщение
То есть достаточно просто отнаследоваться от уже готового кода и не писать одно и то же по 100 раз.
Да но есть и другие подходы повторного использования, например использование сигналов/слотов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.07.2017, 12:52
Помогаю со студенческими работами здесь

Наследование, доступ к private
Есть два класса Passport и ForeignPassport В одном содержится переменная в private которую нельзя изменять, class Passport { ...

private наследование enum
class Pixel1 { public: enum Color { black, blue, green, red = 4, yellow = 14, white = 15 } ; public: Pixel( int64_t...

Наследование private-членов
private-члены класса не наследуются или наследуются, но доступ к ним запрещен из класса потомка и вообще из вне класса, в котором они...

Private/protected/public наследование
Есть такой код: class Base { public: int publicX; protected: int protectedX; private:

private наследование и виртуальный метод
Привет! Тут хотел бы спросить такой вопрос. Есть базовый класс с виртуальным методом в protected секции. Я наследую этот класс как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru