Заблокирован
1

Пояснить, почему в примере не рекомендуется использовать закрытое наследование

15.05.2015, 14:32. Показов 2224. Ответов 34
Метки нет (Все метки)

Всем доброго времени суток !

Помогите пожалуйста разобраться с этой фразой на примере .

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

только из методов производного.

Эта фраза ввела меня в ступор.
Миниатюры
Пояснить, почему в примере не рекомендуется использовать закрытое наследование  
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2015, 14:32
Ответы с готовыми решениями:

Как используя закрытое наследование использовать 2 объекта базового класса?
Доброго времени суток. Учусь по книге "Прата С. Язык программирования C++. Лекции и упражнения....

Почему не рекомендуется использовать препроцессор?
Я сейчас активно пользуюсь #define для упрощения понимания кода. Например, у меня сложная система...

Закрытое наследование
Всем привет. Выполняю упражнение в книжке Прата, тема-закрытое наследование Подскажите пожалуйста,...

Закрытое наследование
Добрый день, форум:) Помогите разобраться: Базовый класс vector и от него наследую допустим...

34
В астрале
Эксперт С++
8042 / 4799 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.05.2015, 14:40 2
RAFA91, Закрытое наследование тут вообще ни при делах. Суть в том, что если нужно хранить два экземпляра одного класса в третьем, то нельзя сделать так

C++
1
2
class A {};
class B : public A, public A {};
Но можно сделать так

C++
1
2
3
4
5
class A {};
class B
{
   A object1, object2;
};
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.05.2015, 15:05 3
Цитата Сообщение от ForEveR Посмотреть сообщение
Закрытое наследование тут вообще ни при делах.
Надо сделать акцент на слове "закрытое". Т.е. наследование тут имеет значение, но не важно какое оно: закрытое, отрытое или защищенное.
0
Заблокирован
15.05.2015, 16:16  [ТС] 4
мне непонятна фраза подчеркнутая красным (((

пожалуйста обьясните подробнее...

почему нельзя использовать закр. наследование если необходимо 2 обьекта базового
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.05.2015, 16:36 5
RAFA91, не по той книжке ты учишься всё таки.
Цитата Сообщение от RAFA91 Посмотреть сообщение
мне непонятна фраза подчеркнутая красным
ForEveR всё написал уже, но если до сих пор не понятно, то попробую объяснить словами.
Если объект должен содержать в своем составе несколько одинаковых элементов, то наследование тут не получится использовать (закрытое, открытое, любое). Нужно использовать агрегирование (вложение одного элемента в другой в виде члена).
0
Заблокирован
15.05.2015, 16:56  [ТС] 6
C++
1
2
class B : public A, public A {};
]
public A {} - - как это понимать ?

A object1, object2; --- это приведет к ошибке компиляции в случае закр. насл ?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.05.2015, 17:02 7
Цитата Сообщение от RAFA91 Посмотреть сообщение
как это понимать ?
Может будет понятнее, если разбить на строки:
C++
1
2
class B : public A, public A 
{};
В указанном коде производится неудачная попытка реализовать множественное наследование.
Неудачная по причине того, что базовые классы выбраны одинаковые.
0
Заблокирован
15.05.2015, 17:10  [ТС] 8
C++
1
class B : public A, public A
ошибка компиляции будет ?

это больше смахивает на множественное наследование )))
0
В астрале
Эксперт С++
8042 / 4799 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.05.2015, 17:45 9
RAFA91, Нельзя наследоваться от одного класса более одного раза. О чем и написано в прикрепленной картинке.
0
Заблокирован
16.05.2015, 12:03  [ТС] 10
почему тогда нету ошибки в этой строке ?
C++
1
class B : public A, public A
0
Форумчанин
Эксперт CЭксперт С++
8190 / 5040 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
16.05.2015, 12:10 11
Цитата Сообщение от RAFA91 Посмотреть сообщение
почему тогда нету ошибки в этой строке ?
В ней ошибка и есть. Если компиль ссылает на следующую строку, то только потому, что
C++
1
class B : public A, public A {};
одна инструкция, а переносы мы ставим чисто для визуального разделения. Для компилятора они значения не имеют.

Добавлено через 2 минуты

Не по теме:

Теперь я знаю, что у вас VS. g++ ссылает ровно на ту строчку, где встретил дублирование.

0
Заблокирован
16.05.2015, 12:20  [ТС] 12
ошибок вообще небыло.

может все-же эта строка рабочая ? (((
0
Форумчанин
Эксперт CЭксперт С++
8190 / 5040 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
16.05.2015, 12:30 13
Цитата Сообщение от RAFA91 Посмотреть сообщение
может все-же эта строка рабочая ? (((
Цитата Сообщение от ForEveR Посмотреть сообщение
нельзя сделать так
Цитата Сообщение от Tulosba Посмотреть сообщение
не получится
Цитата Сообщение от MrGluck Посмотреть сообщение
ошибка и есть
Сколько человек должно озвучить одно и то же?
0
Эксперт С++
3218 / 1745 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
16.05.2015, 12:42 14
Цитата Сообщение от ForEveR Посмотреть сообщение
Закрытое наследование тут вообще ни при делах.
Ну почему же? Открытое наследование реализует отношение "является разновидностью", а закрытое "реализуется посредством". Второе отношение можно реализовать и в виде агрегации, сделав объект используемого класса членом другого класса. В приведенной цитате как раз и говорится, что если используется несколько объектов исходного класса, то закрытое наследование не подходит, и надо использовать агрегацию.
1
Форумчанин
Эксперт CЭксперт С++
8190 / 5040 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
16.05.2015, 12:45 15
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну почему же?
Так вроде о том же написали. Суть не в том, какое наследование, а в том, что нельзя два одинаковых базовых задать.
0
Эксперт С++
3218 / 1745 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
16.05.2015, 12:58 16
Цитата Сообщение от MrGluck Посмотреть сообщение
нельзя два одинаковых базовых задать.
Ну да. Но в приведенной цитате об этом говорится как раз в контексте обсуждения реализации отношения "реализуется посредством", для которой применяется только закрытое наследование, а также агрегация.
0
Заблокирован
16.05.2015, 14:28  [ТС] 17
Всем большое спасибо !!!

только почему же компилятор не ругает меня за эту строку

C++
1
class B : public A, public A ;
0
Форумчанин
Эксперт CЭксперт С++
8190 / 5040 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
16.05.2015, 15:26 18
Цитата Сообщение от RAFA91 Посмотреть сообщение
только почему же компилятор не ругает меня за эту строку
g++ и 13 студия ругаются. Не знаю что вы там используете.
0
Заблокирован
17.05.2015, 12:18  [ТС] 19
Microsoft Visual C++ 6.0
0
Эксперт С++
8719 / 4262 / 950
Регистрация: 15.11.2014
Сообщений: 9,668
17.05.2015, 13:00 20
Цитата Сообщение от RAFA91 Посмотреть сообщение
Microsoft Visual C++ 6.0
потому что древнее, как кал мамонта, наследие времен,
когда со стандартом языка все было плохо.

рекомендую забыть шестую студию, как страшный сон, и взять что нибудь поновее.
например, 2013.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2015, 13:00
Помогаю со студенческими работами здесь

закрытое наследование
Объясните, плиз. Заранее спасибо В классе Base поле X находится в части private, производный...

Закрытое наследование
Помогите, пожалуйста, ответить на такой вопрос: Что такое переопределение методов (в производном...

Закрытое наследование. Вывод строки
Здравствуйте. Необходимо вывести элемент класса std::string в данном случае: class Wine :...

Закрытое наследование, как добраться до функции?
Всем привет! Собственно, я никак не могу понять, как мне использовать функцию sum(), класса...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru