Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
1

Объясните про наследование

07.10.2011, 15:28. Показов 947. Ответов 14
Метки нет (Все метки)

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
class A
{
protected:
    int n; // закрыты для A, но доступны для B
public:
    virtual void func(void) = 0;
};
 
class B: public A
{
public:
    void func(void) 
    {
        //какие то действия с n;
    }
};
int main(void)
{
    B x;
    x.func();
/////////////////////////////////ОШИБКА///////////////////////////////////////
    x.n.какой-то-метод-над-n();
/////////////////////////////////ОШИБКА///////////////////////////////////////
    return 0;
}
Для объекта x класса B int n - недоступное поле, и может быть доступно только через метод. Можно ли каким то образом сделать так, чтобы x получил доступ к n? Кроме как объявить public int n в классе A, хочу чтобы для класса A поле int n отавалось недоступным.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2011, 15:28
Ответы с готовыми решениями:

Наследование. я чего-то не разберусь с доступом.объясните пожалуйста
Суть в том, что есть 2 класса.(предок потомок) У каждого класса есть friends подкласс, которые в...

Вопрос про наследование.
Добрый день всем! Возможно ли создать производный класс в который будут помещены 2 объекта...

Про ромбовидное наследование
Доброе время форумчане! Имеем 3 класс! class A { }; class b { }; class c {

Про наследование от exception
Есть пример наследования класса для создания собственных исключений: class MyException: public...

14
Эксперт С++
516 / 420 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
07.10.2011, 15:38 2
C++
1
2
3
4
5
6
7
8
9
class B: public A
{
public:
        void func(void) 
        {
                //какие то действия с n;
        }
        int &getN() {return n;} 
};
1
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
07.10.2011, 15:50  [ТС] 3
Цитата Сообщение от gooseim Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
class B: public A
{
public:
        void func(void) 
        {
                //какие то действия с n;
        }
        int &getN() {return n;} 
};
Ну это ясно) А если не пользоваться никаким методом , то никак низя?
0
Эксперт С++
516 / 420 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
07.10.2011, 15:52 4
Merovingian, никак нельзя.

Добавлено через 1 минуту
Кстати публичные члены-переменные вообще плохой стиль программирования.
0
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
07.10.2011, 18:38  [ТС] 5
кстати а если объявить в классе B: public A::n;
???
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
07.10.2011, 18:39 6
C++
1
public: int n;
Это значит, что переменная n доступна абсолютно для всех.
C++
1
private: int n;
Это значит, что переменная n доступна только классу( и друзьям), в которой объявлена эта переменная.
C++
1
protected: int n;
Это значит, что переменная n доступна не только своему классу и друзьям, но и еще доступна всем производным классам и друзьям эти производных классов. Ну а раз она доступна для класса B, то она так же будет доступна для класса C, если класс C наследует класс B. Т.е. переменная n доступна всем классам ниже по иерархии.
0
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
07.10.2011, 18:43  [ТС] 7
Цитата Сообщение от Chelioss Посмотреть сообщение
C++
1
public: int n;
Это значит, что переменная n доступна абсолютно для всех.
C++
1
private: int n;
Это значит, что переменная n доступна только классу( и друзьям), в которой объявлена эта переменная.
C++
1
protected: int n;
Это значит, что переменная n доступна не только своему классу и друзьям, но и еще доступна всем производным классам и друзьям эти производных классов. Ну а раз она доступна для класса B, то она так же будет доступна для класса C, если класс C наследует класс B. Т.е. переменная n доступна всем классам ниже по иерархии.
Я немного не тем интересовался)
я про то, что вот так
C++
1
x.n.какой-то-метод-над-n();
нельзя обратиться к int n, если x принадлежит к классу B
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
07.10.2011, 18:47 8
C++
1
2
protected:
        int n; // закрыты для A, но доступны для B
Не правильно. n доступна как для A, так и для B.
C++
1
x.n.какой-то-метод-над-n();
Тут у вас точно две точки?
Тогда не правильно. Я же написал, что protected переменные доступны только для классов A и B, но не доступны для клиентов, т.е. если я пишу программу и использую класс B, то я не имею доступа к n.
Так можно было бы написать, если, конечно, n -это не int, а какой-то класс, переменная n была бы public.

Понял, что вы имели введу. У объекта n типа int нет методов, поэтому нельзя делать как вы.
Встроенные типы(int,double,char и т.д.) не имеют методов.
0
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
07.10.2011, 18:57  [ТС] 9
Цитата Сообщение от Chelioss Посмотреть сообщение
Тогда не правильно. Я же написал, что protected переменные доступны только для классов A и B, но не доступны для клиентов.
Так я в курсе что не правильно, вы почитайте что я под кодом написал) Там вопрос между прочим


Цитата Сообщение от Chelioss Посмотреть сообщение
Не правильно. n доступна как для A, так и для B.
ну вот только этого не надо))) protected члены закрыты по отношению к базовому классу и доступны классу-наследнику
0
Каратель
Эксперт С++
6598 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
07.10.2011, 19:03 10
Цитата Сообщение от Merovingian Посмотреть сообщение
protected члены закрыты по отношению к базовому классу
закрыты из вне, внутри базового они доступны
0
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
07.10.2011, 19:08  [ТС] 11
Цитата Сообщение от Chelioss Посмотреть сообщение
Понял, что вы имели введу. У объекта n типа int нет методов, поэтому нельзя делать как вы.
Встроенные типы(int,double,char и т.д.) не имеют методов.
ну не в том же дело

методы то можно создать, но всеравно таким образом нельзя обратиться к n. Я спрашивал как сделать так, чтобы открыть доступ к n))

и похоже я нашел решение - объявить в классе:
C++
1
B: public A::n;
Добавлено через 2 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
закрыты из вне, внутри базового они доступны
Я то имею ввиду, что закрытые и открытые - это private и public... и это, конечно все внутри класса.... А понятие "доступ" - у меня оно ассоциируется с понятием "наследование".... ну короче понимаете про что я)
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
07.10.2011, 19:44 12
Merovingian
При public наследовании protected данные класса A, становятся protected данными класса B.

И еще раз, раз вы не поняли:
Нет у int методов и нельзя создавать для int методы. Так же нельзя перегружать операции для встроенных типов, в точности операцию "." , для встроенных типов.
Нельзя делать вот так:
n.fun(); если n - это переменная типа int.

Добавлено через 3 минуты
Цитата Сообщение от Merovingian Посмотреть сообщение
Я то имею ввиду, что закрытые и открытые - это private и public... и это, конечно все внутри класса.... А понятие "доступ" - у меня оно ассоциируется с понятием "наследование".... ну короче понимаете про что я)
Вот я не понимаю. Понимать одно под другим - это плохо. Потому что, когда вы будете говорить об этой теме, то всегда, как и сейчас, у вас будут такие вот разговоры о "понимании".
0
MrGluck
07.10.2011, 19:49
  #13

Не по теме:

Мне кажется это извращенство и нарушает инкапсуляцию

1
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
07.10.2011, 19:51 14
Цитата Сообщение от MrGluck Посмотреть сообщение

Не по теме:

Мне кажется это извращенство и нарушает инкапсуляцию

Поэтому лучше обращаться к данным через методов-посредников.

Добавлено через 1 минуту
Вот как вообще связаны между собой наследование и доступ? Я не понимаю, а вы как-то умудряетесь.
0
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
07.10.2011, 20:13  [ТС] 15
Цитата Сообщение от Chelioss Посмотреть сообщение
Вот я не понимаю. Понимать одно под другим - это плохо. Потому что, когда вы будете говорить об этой теме, то всегда, как и сейчас, у вас будут такие вот разговоры о "понимании".
Хватит палку уже перегибать, посмотрите лучше в любой учебник или справочник и посмотрите что такое "доступ" и что такое "закрытые" и что такое "открытые", если вам что-то не понятно. А называли бы все своими именами, то, может быть, и я бы вас понял.

Добавлено через 5 минут
Цитата Сообщение от Chelioss Посмотреть сообщение
Вот как вообще связаны между собой наследование и доступ? Я не понимаю, а вы как-то умудряетесь.
Я между прочим хоть еще и очень плохо освоил ООП, но очень правильно дал определение:
protected члены закрыты по отношению к базовому классу и доступны классу-наследнику
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2011, 20:13

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

Небольшой вопрос про наследование.
Как понять Circle (int x, int y, int r, TColor p, TColor b) : cx (x), cy (y), rad (r),...

Глупый вопрос про наследование
Вот фрагмент кода, реального: class CListviewParamPrimary : public CListviewParamFloats { ...

Задача про множественное наследование и включение
Добрый день. Решаю задачу из Праты глава 14. Условие: Класс Person предназначен для хранения имени...

Объясните про исключения
Собственно хочу реализовать класс исключений. Начал искать информацию в интернете, но там были в...


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

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

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