Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1

Для чего нужно protected и private наследование

25.06.2018, 16:51. Показов 4176. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
для чего нужно protected и private наследование.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.06.2018, 16:51
Ответы с готовыми решениями:

Для чего нужны модификаторы protected, private, public
подскажите, кто в курсе, зачем вообще нужны эти модификаторы доступа? ведь, все их можно обойти... сейчас курю Страуструпа "Дизайн...

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

Наследование. Помогите с этими public, protected. private
Вот код, в нем вылетает ошибка Unit2.cpp(16): E2251 Cannot find default constructor to initialize base class 'My' в файле unit2.cpp во...

16
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
25.06.2018, 17:10
Для того, чтобы все члены базового класса не были доступны снаружи (были доступны только изнутри класса, или друзьям класса). Private наследование необходимо чтобы передать реализацию (То есть наследует реализацию). При этом приведение к private-предку недоступно, соответственно Div никогда не будет действовать как объект базового класса.
Другими словами класс Div моделирует отношения реализован на основе Base, а не является им
По сути, данное наследование можно заменить композицией.
То есть
C++
1
2
3
class A{};
class B:private A{};
A *base=new B; // не работает
1
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
25.06.2018, 17:14
C++
1
2
3
class A {};
class B :private A {};
A *base = (A*)new B; // работает
0
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
25.06.2018, 17:18
QuakerRUS, Только зачем?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
#include <iostream>
class A{};
class B{};
 
int main()
{
    A *base=(A*)new B(); // тоже работает 
}
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
25.06.2018, 17:24
Peoples, в последнем примере не вижу наследования. В моем можно изменить данные базового класса.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
class A
{
public:
    int t{ true };
};
 
class B :private A {};
 
int main()
{
    A *base = (A*)new B; // работает
    base->t = false;
    std::cout << base->t << std::endl;
 
    system("pause");
    return 0;
}
0
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
25.06.2018, 17:27
QuakerRUS И без наследования работает ,
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
class A
{
    public:
    int x=5;
};
 
class B{};
 
int main()
{
    A *base=(A*)new B(); 
    base->x=10;
    std::cout<<base->x; // 10
}
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
25.06.2018, 17:29  [ТС]
Цитата Сообщение от Peoples Посмотреть сообщение
По сути, данное наследование можно заменить композицией.
а protected наследование чем можно заменить?

Добавлено через 1 минуту
или protected наследование тоже что и private только от protected унаследоваемого можно унаследоваться а от private нет?
0
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
25.06.2018, 17:48
QuakerRUS,
Каст в стиле С, это последовательные попытки применения
Code
1
2
3
4
5
const_cast
static_cast
static_cast и потом const_cast
reinterpret_cast
reinterpret_cast и потом const_cast
Какой первый подойдет - тот и применяется.
Таким образом ты много чего привести можешь. Можно привести то, что даже и не нужно

Но в случае с private и protected наследование работает всё корректно (если приведение однозначно и нет виртуального наследования).
Просто надо понимать, что в большинстве случаев это не панацея

Добавлено через 16 минут
_stanislav, Protected от части тоже самое, но. Используют его, например, когда есть базовый класс, который наследует функции из другого класса. И нужно чтобы класс наследник мог использовать эти функции тоже
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.06.2018, 17:58
Цитата Сообщение от Peoples Посмотреть сообщение
И без наследования работает ,
ничего странного не наблюдаете?

http://rextester.com/CUQE37721

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
 
class A
{
    public:
    int x = 1, y = 2;
};
 
class B
{
    
};
 
int main()
{
    int v1 = 333;    
    B b;
    int v2 = 666;    
    
    
    A* base=(A*) &b; 
    
    base->y = 10;
    std::cout << "base->y = " << base->y << std::endl;
    std::cout << "v1 = " << v1 << std::endl; 
    std::cout << "v2 = " << v2 << std::endl; 
}

base->y = 10
v1 = 10
v2 = 666
0
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
25.06.2018, 18:07
hoggy, Наблюдаю. Поэтому и привел пример того, что кастить можно, но осторожно

Добавлено через 4 минуты
hoggy, gcc, кстати, нормально отрабатывает
http://rextester.com/ZED5360

Добавлено через 1 минуту
hoggy, А у clang сходит с ума y
base->y = 4198912
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.06.2018, 18:07
Цитата Сообщение от Peoples Посмотреть сообщение
Наблюдаю. Поэтому и привел пример того, что кастить можно, но осторожно
то есть, вы наблюдаете косяк в действии,
но все равно думаете что так делать можно?


вот ещё забавный косяк в действии:
http://rextester.com/FUYN34259

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
struct A
{
    virtual ~A(){}
    virtual void foo()const { std::cout << "A::foo\n"; }
    virtual void bar()const { std::cout << "A::bar\n"; }
};
 
struct B
{
    virtual ~B(){}
    virtual void bar()const { std::cout << "B::bar\n"; }
    virtual void foo()const { std::cout << "B::foo\n"; }
};
 
int main()
{
    B b;
    A* a = (A*) &b; 
    
    // перепутались местами
    a->foo(); // <--- B::bar
    a->bar(); // <--- B::foo
}
0
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
25.06.2018, 18:10
hoggy,
Цитата Сообщение от Peoples Посмотреть сообщение
можно
Я не конкретно про свой пример. Мой пример как раз показывает наоборот. Что бездумным кастом можно навертеть много чего интересного.
Мораль была в том, что си каст можно юзать, но надо думать, прежде чем это делать
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.06.2018, 18:12
Цитата Сообщение от Peoples Посмотреть сообщение
Мораль была в том, что си каст можно юзать, но надо думать, прежде чем это делать
лучше вообще его не юзать в с++.
1
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
25.06.2018, 18:24
hoggy, Ну или так
Цитата Сообщение от hoggy Посмотреть сообщение
лучше вообще его не юзать
Добавлено через 11 минут
_stanislav, Глупый, но пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
 
class Base
{
    public:
    void b()
    {
        std::cout<<"b";
    };
};
 
class Div:protected Base{};
 
class Divv:public Div
{
    public:
    void show()
    {
        b();
    }
};
 
int main()
{
    Divv d;
    d.show();
}
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
25.06.2018, 18:27  [ТС]
Peoples, да я понял спасибо, самый опасный пример по ходу у хогги был в другой теме там где множественное наследование было.

Добавлено через 1 минуту
по моему вопросу
0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
25.06.2018, 19:46
По факту, он не нужен.

Писать
C++
1
2
3
4
class A{
private:
  B b;
};
Проще и понятнее.
То же самое с protected.
1
 Аватар для Новичок
1682 / 1098 / 489
Регистрация: 17.07.2012
Сообщений: 5,360
25.06.2018, 20:37
Цитата Сообщение от _stanislav Посмотреть сообщение
для чего нужно protected и private наследование.
Чисто мое мнение: на практике от этого никакой пользы. В других же языках как-то живут без этого.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.06.2018, 20:37
Помогаю со студенческими работами здесь

Для чего написано: protected String name; protected int age;?
package com.company; import java.io.Serializable; public class person implements Serializable { protected String name; ...

Для чего нужно наследование именно в таком виде?
Приветствую. Мне тут человек задал вопрос: Мы оба являемся начинающими программистами (C++/Java) и, честно говоря, вопрос...

Зачем нужно private наследование в классах?
Если можно, то покажите небольшой пример

Модификаторы private и protected
Как сказано в учебнике (Е.Р. Алексеев и компания): Однако, если классы описаны в пределах одного модуля, то из методов других...

Protected Private Public
Возник вопрос, немного наверное бредовый и на практике наврятли применимый, но всё же интересно, а возможно поменять модификатор доступа в...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки 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
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru