Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
#1

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

07.10.2011, 15:28. Просмотров 829. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2011, 15:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объясните про наследование (C++):

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

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

Про наследование от exception - C++
Есть пример наследования класса для создания собственных исключений: class MyException: public std::exception { virtual const char*...

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

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

Глупый вопрос про наследование - C++
Вот фрагмент кода, реального: class CListviewParamPrimary : public CListviewParamFloats { private: /** * @brief Возвращает...

14
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
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
Merovingian
54 / 54 / 5
Регистрация: 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
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
07.10.2011, 15:52 #4
Merovingian, никак нельзя.

Добавлено через 1 минуту
Кстати публичные члены-переменные вообще плохой стиль программирования.
0
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
07.10.2011, 18:38  [ТС] #5
кстати а если объявить в классе B: public A::n;
???
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
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
Merovingian
54 / 54 / 5
Регистрация: 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
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
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
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
07.10.2011, 18:57  [ТС] #9
Цитата Сообщение от Chelioss Посмотреть сообщение
Тогда не правильно. Я же написал, что protected переменные доступны только для классов A и B, но не доступны для клиентов.
Так я в курсе что не правильно, вы почитайте что я под кодом написал) Там вопрос между прочим


Цитата Сообщение от Chelioss Посмотреть сообщение
Не правильно. n доступна как для A, так и для B.
ну вот только этого не надо))) protected члены закрыты по отношению к базовому классу и доступны классу-наследнику
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.10.2011, 19:03 #10
Цитата Сообщение от Merovingian Посмотреть сообщение
protected члены закрыты по отношению к базовому классу
закрыты из вне, внутри базового они доступны
0
Merovingian
54 / 54 / 5
Регистрация: 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
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
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
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
07.10.2011, 19:51 #14
Цитата Сообщение от MrGluck Посмотреть сообщение

Не по теме:

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

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

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

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

Объясните про strchr - C++
pch-str+1 - 1).что это значит? Координально не понятно, ведь строкой выше, а именно pch=strchr(str,'s') мы присвоили pch адрес переменной...

Объясните про инициализацию - C++
Реализовал свой класс для строки (в качестве практики изучения c++) class TString { char* p; int size; public: ...

Популярно объясните про указатели - C++
Что-то плохо даётся мне тема про указатели. Я хорошо уяснил, что вот так создаётся указатель: int *pointer; Я так же хорошо...

подскажите как првильно написать программу про наследование классов - C++
подскажите как првильно написать задачу про наследование классов вот надо написать задачу про кошку чтобы 1 пророда-сиамская ...


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

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

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