Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
(80 / 20 || 50 / 50) = x
1692 / 1158 / 441
Регистрация: 16.08.2014
Сообщений: 4,848
Записей в блоге: 1
1

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

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

для чего нужно protected и private наследование.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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...

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

16
Эксперт С++
1585 / 915 / 777
Регистрация: 06.02.2016
Сообщений: 2,399
Записей в блоге: 29
25.06.2018, 17:10 2
Для того, чтобы все члены базового класса не были доступны снаружи (были доступны только изнутри класса, или друзьям класса). Private наследование необходимо чтобы передать реализацию (То есть наследует реализацию). При этом приведение к private-предку недоступно, соответственно Div никогда не будет действовать как объект базового класса.
Другими словами класс Div моделирует отношения реализован на основе Base, а не является им
По сути, данное наследование можно заменить композицией.
То есть
C++
1
2
3
class A{};
class B:private A{};
A *base=new B; // не работает
1
1083 / 822 / 384
Регистрация: 30.10.2017
Сообщений: 2,312
25.06.2018, 17:14 3
C++
1
2
3
class A {};
class B :private A {};
A *base = (A*)new B; // работает
0
Эксперт С++
1585 / 915 / 777
Регистрация: 06.02.2016
Сообщений: 2,399
Записей в блоге: 29
25.06.2018, 17:18 4
QuakerRUS, Только зачем?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
#include <iostream>
class A{};
class B{};
 
int main()
{
    A *base=(A*)new B(); // тоже работает 
}
0
1083 / 822 / 384
Регистрация: 30.10.2017
Сообщений: 2,312
25.06.2018, 17:24 5
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
Эксперт С++
1585 / 915 / 777
Регистрация: 06.02.2016
Сообщений: 2,399
Записей в блоге: 29
25.06.2018, 17:27 6
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
(80 / 20 || 50 / 50) = x
1692 / 1158 / 441
Регистрация: 16.08.2014
Сообщений: 4,848
Записей в блоге: 1
25.06.2018, 17:29  [ТС] 7
Цитата Сообщение от Peoples Посмотреть сообщение
По сути, данное наследование можно заменить композицией.
а protected наследование чем можно заменить?

Добавлено через 1 минуту
или protected наследование тоже что и private только от protected унаследоваемого можно унаследоваться а от private нет?
0
Эксперт С++
1585 / 915 / 777
Регистрация: 06.02.2016
Сообщений: 2,399
Записей в блоге: 29
25.06.2018, 17:48 8
QuakerRUS,
Каст в стиле С, это последовательные попытки применения
Код
const_cast
static_cast
static_cast и потом const_cast
reinterpret_cast
reinterpret_cast и потом const_cast
Какой первый подойдет - тот и применяется.
Таким образом ты много чего привести можешь. Можно привести то, что даже и не нужно

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

Добавлено через 16 минут
_stanislav, Protected от части тоже самое, но. Используют его, например, когда есть базовый класс, который наследует функции из другого класса. И нужно чтобы класс наследник мог использовать эти функции тоже
1
Эксперт С++
8274 / 3850 / 837
Регистрация: 15.11.2014
Сообщений: 8,726
25.06.2018, 17:58 9
Цитата Сообщение от 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
Эксперт С++
1585 / 915 / 777
Регистрация: 06.02.2016
Сообщений: 2,399
Записей в блоге: 29
25.06.2018, 18:07 10
hoggy, Наблюдаю. Поэтому и привел пример того, что кастить можно, но осторожно

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

Добавлено через 1 минуту
hoggy, А у clang сходит с ума y
base->y = 4198912
0
Эксперт С++
8274 / 3850 / 837
Регистрация: 15.11.2014
Сообщений: 8,726
25.06.2018, 18:07 11
Цитата Сообщение от 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
Эксперт С++
1585 / 915 / 777
Регистрация: 06.02.2016
Сообщений: 2,399
Записей в блоге: 29
25.06.2018, 18:10 12
hoggy,
Цитата Сообщение от Peoples Посмотреть сообщение
можно
Я не конкретно про свой пример. Мой пример как раз показывает наоборот. Что бездумным кастом можно навертеть много чего интересного.
Мораль была в том, что си каст можно юзать, но надо думать, прежде чем это делать
0
Эксперт С++
8274 / 3850 / 837
Регистрация: 15.11.2014
Сообщений: 8,726
25.06.2018, 18:12 13
Цитата Сообщение от Peoples Посмотреть сообщение
Мораль была в том, что си каст можно юзать, но надо думать, прежде чем это делать
лучше вообще его не юзать в с++.
1
Эксперт С++
1585 / 915 / 777
Регистрация: 06.02.2016
Сообщений: 2,399
Записей в блоге: 29
25.06.2018, 18:24 14
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
(80 / 20 || 50 / 50) = x
1692 / 1158 / 441
Регистрация: 16.08.2014
Сообщений: 4,848
Записей в блоге: 1
25.06.2018, 18:27  [ТС] 15
Peoples, да я понял спасибо, самый опасный пример по ходу у хогги был в другой теме там где множественное наследование было.

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

Писать
C++
1
2
3
4
class A{
private:
  B b;
};
Проще и понятнее.
То же самое с protected.
1
Модератор
1600 / 1060 / 480
Регистрация: 17.07.2012
Сообщений: 5,245
25.06.2018, 20:37 17
Цитата Сообщение от _stanislav Посмотреть сообщение
для чего нужно protected и private наследование.
Чисто мое мнение: на практике от этого никакой пользы. В других же языках как-то живут без этого.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.06.2018, 20:37

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.