Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 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. Показов 4141. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru