807 / 403 / 82
Регистрация: 10.06.2014
Сообщений: 2,522
|
|
1 | |
А где вы используете private наследование?30.06.2017, 19:15. Показов 4519. Ответов 30
Метки нет Все метки)
(
Насколько я знаю то при приватном наследовании наследник ничего от родительского класса не наследует.
Тогда зачем оно нужно? Ничего же не наследуется. На мой взгляд это может понадобится если нужно по определенным причинам выдать один тип за другой за счёт базового. Но хотелось бы узнать мнение более опытных
0
|
|
30.06.2017, 19:15 | |
Ответы с готовыми решениями:
30
А где вы используете private наследование?
Наследование private
|
Заблокирован
|
|
30.06.2017, 19:18 | 2 |
1
|
Ушел с форума
![]() |
|
30.06.2017, 19:30 | 3 |
![]() Решение
См. Boost.NonCopyable, например.
Это класс, наследуясь от которого, мы запрещаем копирование объекта. Здесь наследование как раз должно быть приватным, иначе потенциальные наследники класса могли бы получить доступ к запрещенным функциям... noncopyable http://www.boost.org/doc/libs/... yable.html Добавлено через 15 секунд См. Boost.NonCopyable, например. Это класс, наследуясь от которого, мы запрещаем копирование объекта. Здесь наследование как раз должно быть приватным, иначе потенциальные наследники класса могли бы получить доступ к запрещенным функциям... noncopyable http://www.boost.org/doc/libs/... yable.html
3
|
807 / 403 / 82
Регистрация: 10.06.2014
Сообщений: 2,522
|
|
30.06.2017, 21:23 [ТС] | 4 |
daun-autist,
Это потому что ничего из базового класса нельзя будет вызвать что либо? А как насчёт трюков в отношении метапрограммирования? Убежденный, Там класс вроде пустой. Запрещение копирования происходит за счёт того что конструктор родительского класса недоступен?
0
|
807 / 403 / 82
Регистрация: 10.06.2014
Сообщений: 2,522
|
||||||
01.07.2017, 11:42 [ТС] | 7 | |||||
MrGluck, daun-autist,
Спасибо за помощь Добавлено через 13 часов 37 минут Убежденный, Разобрался вроде. Просто запрещается копирование родительского класса и все, поэтому с помощью конструктора по умолчанию копировать объект не получается(да и создать тоже)... daun-autist, А откуда вы взяли такое правило? Ваше утверждение судя по всему не действительно
0
|
Неэпический
|
|
01.07.2017, 12:55 | 8 |
Undisputed, выше ссылка на isocpp faq.
Вы ппутаете ООП концепции и C++. Мешаете как хотите их. Наследование в C++ и "отношения" классов в ООП это как бэ разные вещи. Одно может наследоваться от другого, но не удовлетворять требованиям "является". Вы не можете использовать bar так, как будто это foo, т.к. наследование приватное. Только сам класс bar может работать так, как будто он foo, но внешний код так уже работать не может, так что никакого is-a здесь нет. Зато приватное наследование вполне подходит под композицию (has-a).
1
|
807 / 403 / 82
Регистрация: 10.06.2014
Сообщений: 2,522
|
|
01.07.2017, 13:50 [ТС] | 9 |
Croessmah
Ну если говорить чисто о терминологии и определениях то да, я с вами полностью согласен. Под понятием "является" я понимал именно возможность определить наличие родительского класса в дереве наследования независимо от типа наследования.
0
|
Avazart
|
01.07.2017, 21:55
#10
|
Не по теме: private-наследование это отношение "содержит", обычно...
0
|
![]() 8724 / 4304 / 958
Регистрация: 15.11.2014
Сообщений: 9,751
|
|
01.07.2017, 22:40 | 11 |
0
|
02.07.2017, 10:41 | 12 |
Плюс еще одно применение private наследования - у базового класса нет виртуального деструктора и мы хотим запретить приводить указатель на дочерний класс к указателю на базовый (чтоб не было проблем с вызовом деструктора). На практике я 1 раз в жизни так делал)
0
|
![]() 8724 / 4304 / 958
Регистрация: 15.11.2014
Сообщений: 9,751
|
|
02.07.2017, 10:57 | 13 |
0
|
807 / 403 / 82
Регистрация: 10.06.2014
Сообщений: 2,522
|
|
02.07.2017, 12:41 [ТС] | 16 |
Avazart,
Может же быть так что нам не нужен экземпляр базового класса(а композиция требует этого), и полиморфизм тоже не нужен, но при этом нескольким наследникам требуется функциональность этого базового класса т.к он для них общий. Например для реализации инкапсуляции часто используются методы setSomething, getSomething и чтоб не повторять эти методы во всех классах где нужен функционал этого Something-a очень даже удобно выделить сеттер и геттер в отдельный класс и наследовать эти методы
0
|
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
|
|
02.07.2017, 12:41 | 17 |
Все же я не понял, для чего тут использовать private наследование, ведь можно самому указать, что копирование класса
= delete;
0
|
807 / 403 / 82
Регистрация: 10.06.2014
Сообщений: 2,522
|
|
02.07.2017, 12:49 [ТС] | 19 |
mat_for_c,
Думаю все дело в том что у программистов есть хорошая привычка реализовывать заранее один раз часто используемый функционал и использовать его там где он нужен тем самым создав некий стандарт кодирования и удобство... То есть достаточно просто отнаследоваться от уже готового кода и не писать одно и то же по 100 раз. Да и до с++11 delete для методов вроде и нет. Думаю как то так... Но посмотрим что скажет Убежденный ![]()
0
|
![]() |
|
02.07.2017, 12:52 | 20 |
В идеале это так, на практике это применимо когда решается схожие задачи.
А когда каждый раз новая задача приходится писать новый код, переписывать старый или искать другую библиотеку. Да но есть и другие подходы повторного использования, например использование сигналов/слотов.
0
|
02.07.2017, 12:52 | |
Помогаю со студенческими работами здесь
20
private наследование и виртуальный метод Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |