Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
zybrzybr
18 / 17 / 0
Регистрация: 29.09.2010
Сообщений: 156
1

Доступ к закрытым членам базового класса

13.07.2013, 01:07. Просмотров 1439. Ответов 20
Метки нет (Все метки)

помогите понять что я не так сделал ?

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
 
using namespace std;
class A
{
    int PrA1;
public:
    int PuA1;
    int get_PrA ()
    {
        return PrA1;
    }
    A() : PrA1(1)
    {
        PuA1 = 11;
    }
};
 
class B: private A {
    int PrB1;
public:
    int PuB1;
    int A:: PuA1;
    int get_PrA1()
    {
        return А::get_PrA();
    }
    B() : PrB1(3)
    {
        PuB1 = PuA1;
    }
};
 
 
int main()
{
    B Ob1;
    cout << Ob1.get_PrA1() << endl;
    cout << Ob1.PuA1 << endl;
    cout << Ob1.PuB1 << endl;
    int i;
    cin >> i;
    return 0;
}
я так понялЖ
1) создавая обьект класса В вызывается первым конструктор базового класса. в конструкторе инициализируются переменные
C++
1
PrA1(1)
PrA1 принимает 1.

2) потом методом класса В должен запустить открытый метод класса А. но печатает фигню!
что здесь не правильно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2013, 01:07
Ответы с готовыми решениями:

Доступ к закрытым членам класса(шаблона)
Вопрос почему компилятор выдает ошибку в функции main? Ситуация следующая...

Перегрузка операторов и доступ к закрытым членам
Поясните, пожалуйста, почему, когда при перегрузке операторов, елис как...

Доступ к закрытым элементам класса - Вопрос
Доброго всем времени суток. Итак, столкнулся с одной непонятной вещью,...

Доступ к членам класса
Есть два класса: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace...

Доступ к членам класса
Объект класса не может получить доступ к своим переменным?

20
ovner
7 / 7 / 5
Регистрация: 06.10.2012
Сообщений: 140
13.07.2013, 01:35 2
возможно надо написать:
C++
1
class B: public A {
а не
C++
1
class B: private A {
0
zybrzybr
18 / 17 / 0
Регистрация: 29.09.2010
Сообщений: 156
13.07.2013, 01:39  [ТС] 3
если обьявит ьбазовый как публик, то , как я понял, должны стать доступны открытые базовые, а закрытые все равно остаються закрытыми. я просто вот думаю, что если доступ к закрытым осуществляеться через методы, то если разрешить ОТКРЫТЫЙ базовый метод (кторый возвращает закрытый базовый элемент), то можно получить доступ к закрытым данным в базовом)

т.е. задача получить доступ к закрытым данным в базовом классе.
0
ovner
7 / 7 / 5
Регистрация: 06.10.2012
Сообщений: 140
13.07.2013, 01:41 4
Цитата Сообщение от zybrzybr Посмотреть сообщение
если обьявит ьбазовый как публик, то , как я понял, должны стать доступны открытые базовые, а закрытые все равно остаються закрытыми. я просто вот думаю, что если доступ к закрытым осуществляеться через методы, то если разрешить ОТКРЫТЫЙ базовый метод (кторый возвращает закрытый базовый элемент), то можно получить доступ к закрытым данным в базовом)

т.е. задача получить доступ к закрытым данным в базовом классе.
тогда в классе А лучше использовать protected а не private, и будет доступ без проблем
0
Croessmah
++Ͻ
14619 / 8371 / 1578
Регистрация: 27.09.2012
Сообщений: 20,566
Записей в блоге: 2
Завершенные тесты: 1
13.07.2013, 01:41 5
А так?
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
 
using namespace std;
class A
{
    int PrA1;
public:
    int PuA1;
    int get_PrA ()
    {
        return PrA1;
    }
    A() : PrA1(1)
    {
        PuA1 = 11;
    }
};
 
class B: public A {
    int PrB1;
public:
    int PuB1;
    int get_PrA1()
    {
        return A::get_PrA();
    }
    B() : PrB1(3)
    {
        PuB1 = PuA1;
    }
};
 
 
int main()
{
    B Ob1;
    cout << Ob1.get_PrA1() << endl;
    cout << Ob1.PuA1 << endl;
    cout << Ob1.PuB1 << endl;
    int i;
    cin >> i;
    return 0;
}
1
zybrzybr
18 / 17 / 0
Регистрация: 29.09.2010
Сообщений: 156
13.07.2013, 01:44  [ТС] 6
Цитата Сообщение от Croessmah Посмотреть сообщение
А так?
C++
1
2
3
4
5
6
#include <iostream>
class B: public A {
    int PrB1;
public:
    int PuB1;
}

так а что поменялось ? все одно выводит фигню.
я правильно понял , что при создании обьекта класса В первым вызываеться конструктор А , псле конструктор В ?
если да, то доолжно вывести 1
0
IGPIGP
13.07.2013, 01:45
  #7

Не по теме:

Чет я напутал или глюкнуло. Второй пост появился вместо исправления первого :)

1
Croessmah
++Ͻ
14619 / 8371 / 1578
Регистрация: 27.09.2012
Сообщений: 20,566
Записей в блоге: 2
Завершенные тесты: 1
13.07.2013, 01:47 8
Цитата Сообщение от zybrzybr Посмотреть сообщение
все одно выводит фигню.
замена private на public не всё что я изменил
http://ideone.com/c2GhXH

Добавлено через 1 минуту

Не по теме:

IGPIGP, лучше поздно, чем никогда :)


Цитата Сообщение от zybrzybr Посмотреть сообщение
так а что поменялось ?
В посте IGPIGP видно

Не по теме:

уже не видно :D

2
zybrzybr
18 / 17 / 0
Регистрация: 29.09.2010
Сообщений: 156
13.07.2013, 01:47  [ТС] 9
а что происходит если обьявить в классе В пременную из класса А ?? почему так происходит?

а если обьявлять базовый закрытым, тополучаеться никак??
эту строку
C++
1
int A:: PuA1;
я написал потому что получил такую ошибку
CodeBlocks : «int A::PuA1» is inaccessible
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7056 / 3358 / 455
Регистрация: 04.12.2011
Сообщений: 9,341
Записей в блоге: 5
13.07.2013, 01:50 10
Цитата Сообщение от zybrzybr Посмотреть сообщение
а что происходит если обьявить в классе В пременную из класса А ?? почему так происходит?
Двойное объявление это нельзя. Да и зачем, - пользуйтесь тем что уже есть.
Цитата Сообщение от Croessmah Посмотреть сообщение
В посте IGPIGP видно
Дык, как под копирку то что и у Вас.)
0
zybrzybr
18 / 17 / 0
Регистрация: 29.09.2010
Сообщений: 156
13.07.2013, 01:57  [ТС] 11
в книге сказано что если базовый обьявлен как закрытый то доступ можно получить к открытим путем разрешения области видимости. а к закрытым как ?) вот методы имют право на доступ к закрытым?
я вот что хотел сделать: в базовом обьявить открытый метод, разрешить его в производном и прочитать закрытый...

как это сделать?) подскажите пожалуйсто!
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7056 / 3358 / 455
Регистрация: 04.12.2011
Сообщений: 9,341
Записей в блоге: 5
13.07.2013, 02:08 12
Ну вообще, что-нибудь весёлое можно всегда придумать:
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
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
using namespace std;
class A
{
private:
    int PrA1;
public:
    int PuA1;
    int get_PrA ()
    {
        return PrA1;
    }
    A() : PrA1(1)
    {
        PuA1 = 11;
    }
};
 
class B: private A {
    int PrB1;
public:
    int PuB1;
    int get_pra1(){return get_PrA ();}//аж вотаквот?
    
    B() 
:A(), PrB1(3)
    {
        PuB1 = PuA1;
    }
};
 
int main()
{
    B Ob1;
    cout << Ob1.get_pra1()<<endl;//
        cin.get();
    return 0;
}
0
zybrzybr
18 / 17 / 0
Регистрация: 29.09.2010
Сообщений: 156
13.07.2013, 02:12  [ТС] 13
Цитата Сообщение от IGPIGP Посмотреть сообщение
B()
:A(), PrB1(3)
а как это понять?
вызываеться конструктор А() в конструкторе В() или что это?)
уж извините, я недавно начал эту Си изучать)
а метод из класса А будет разве виден без разрешения? базовый класс оббьявлен как закрытый?

блин работает!! ))
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7056 / 3358 / 455
Регистрация: 04.12.2011
Сообщений: 9,341
Записей в блоге: 5
13.07.2013, 02:17 14
Цитата Сообщение от zybrzybr Посмотреть сообщение
а как это понять?
вызываеться конструктор А() в конструкторе В() или что это?)
Да.
Цитата Сообщение от zybrzybr Посмотреть сообщение
а метод из класса А будет разве виден без разрешения? базовый класс оббьявлен как закрытый?
Скомпилируйте.
0
zybrzybr
18 / 17 / 0
Регистрация: 29.09.2010
Сообщений: 156
13.07.2013, 02:23  [ТС] 15
выходит то конструктор игнорирует доступ ?)
1) откуда появился доступ к PrA1 в конструкторе?
2) и почему уже доступ появился к закрытому методу? (закрутому наследственно)

Добавлено через 59 секунд
Цитата Сообщение от IGPIGP Посмотреть сообщение
Скомпилируйте.
блин, компилируется, но не поятно))))
0
Croessmah
++Ͻ
14619 / 8371 / 1578
Регистрация: 27.09.2012
Сообщений: 20,566
Записей в блоге: 2
Завершенные тесты: 1
13.07.2013, 02:33 16
Цитата Сообщение от zybrzybr Посмотреть сообщение
откуда появился доступ к PrA1 в конструкторе?
В каком и где он появился?
Цитата Сообщение от zybrzybr Посмотреть сообщение
2) и почему уже доступ появился к закрытому методу?
где? когда?
0
zybrzybr
18 / 17 / 0
Регистрация: 29.09.2010
Сообщений: 156
13.07.2013, 02:36  [ТС] 17
сделал вот так вот :

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
28
29
30
31
32
33
34
35
36
37
#include <iostream>
using namespace std;
class A
{
private:
    int PrA1;
public:
 [B]   int PuA1;[/B]
    int get_PrA ()
    {
        return PrA1;
    }
    A() : PrA1(1), PuA1(2) {;}
};
 
class B: private A {
    int PrB1;
public:
    int PuB1;
    int get_pra1(){return get_PrA ();}
////////////////////////////////////////////////
    int get_pua1() {return PuA1;}          ///
////////////////////////////////////////////////
    B(): A(), PrB1(3)
    {
        PuB1 = PuA1;
    }
};
 
int main()
{
    B Ob1;
    cout << Ob1.get_pra1()<<endl;//
    cout << Ob1.get_pua1()<<endl;
        cin.get();
    return 0;
}
и получилось что этот приват ничего не скрывает, если обьявит ьбазовый конструктор в конструкторе?
т.е. получаем полный доступ к без разрешения к открытым базовым, а через открытые методы и к закрытым базового ?
я правильно понял что это что то вроде глобального разрешения, игнорирующее слово class B: private A { при обьявлении ?
0
Croessmah
++Ͻ
14619 / 8371 / 1578
Регистрация: 27.09.2012
Сообщений: 20,566
Записей в блоге: 2
Завершенные тесты: 1
13.07.2013, 02:38 18
Цитата Сообщение от zybrzybr Посмотреть сообщение
приват ничего не скрывает, если обьявит ьбазовый конструктор в конструкторе?
что это значит?
Цитата Сообщение от zybrzybr Посмотреть сообщение
private A
это для тех, кто захочет обратиться снаружи к членам класса, через производный класс
0
zybrzybr
18 / 17 / 0
Регистрация: 29.09.2010
Сообщений: 156
13.07.2013, 02:42  [ТС] 19
Цитата Сообщение от Croessmah Посмотреть сообщение
что это значит?
C++
1
B(): A(), PrB1(3)
Цитата Сообщение от Croessmah Посмотреть сообщение
это для тех, кто захочет обратиться снаружи к членам класса, через производный класс
но сам класс тоже не имеет доступа к базовому , ну так написано в книге...
должен скрывать в производном все от базового. хотя конечно что он вообще тогда от него анследовал? )
0
Croessmah
++Ͻ
14619 / 8371 / 1578
Регистрация: 27.09.2012
Сообщений: 20,566
Записей в блоге: 2
Завершенные тесты: 1
13.07.2013, 02:47 20
Цитата Сообщение от zybrzybr Посмотреть сообщение
но сам класс тоже не имеет доступа к базовому
К public и protected членам имеет
1
13.07.2013, 02:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2013, 02:47

Доступ к private членам класса
Почему при таком объявлении не работает оператор вывода, по идее он же объявлен...

Дружественная функция-оператор, доступ к закрытым полям класса
У меня есть класс MyClass, вот код: class MyClass { int x, y; public:...

Доступ к членам одного класса с другого
Есть три файла: A.cpp: #include &quot;B.cpp&quot; class AA { int A; public:...


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

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

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