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

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

Войти
Регистрация
Восстановить пароль
 
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
#1

Наследование. я чего-то не разберусь с доступом.объясните пожалуйста - C++

29.05.2012, 16:18. Просмотров 340. Ответов 5
Метки нет (Все метки)

Суть в том, что есть 2 класса.(предок потомок)
У каждого класса есть friends подкласс, которые в свою очередь связаны тем же отношением(предок, потомок)
предок----->наследник
__|___________|_____
__|___________|_____
__|___________|_____
__V___________V_____
предок----->наследник

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
template<class T>
class base
{
protected:
    T* data;
public:
    base(){data = NULL;}
    virtual ~base(){if(data)delete data;}
 
    friend class it;
 
    class it
    {
    protected:
        base* b;
    public:
        virtual ~it(){;}
        it(base* p ){ b = p;}
        virtual void* operator*()
        {
            return (void*)(b->data);
        }
    };
};
 
template<class T,class D>
class son: public base<T>
{
    D* d;
public:
    son():base(){d = NULL;}
    virtual ~son(){if(d) delete d;}
 
    friend class son_it;
 
    class son_it: public it
    {
    public:
        son_it(son* p):it(p){;}
        virtual ~son_it(){;}
        void* operator*()
        {
            if(((son*)b)->d)return (void*)(((son*)b)->d);
            return (void*)(((it*)this)->b->data);//error C2248 - обращение к protected зоне
//          ((it*)this)->b; //аналогично
        }
    };
};
int main()
{
    base<int> a;
    son<int,char> b;
    son<int,char>::son_it it_b(&b);
    base<int>::it it_a(&a);
    *it_a;
    *it_b;
    system("pause");
    return EXIT_SUCCESS;
}
так вот, почему выдается такая ошибка, почему приведя тип указателя от son_it* к it* я не могу залезть в защищенную зону класса it(это вообще убило), а так же base....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2012, 16:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование. я чего-то не разберусь с доступом.объясните пожалуйста (C++):

Объясните про наследование - C++
class A { protected: int n; // закрыты для A, но доступны для B public: virtual void func(void) = 0; }; class B: public...

Для чего нужны виртуальные функции и виртуальное наследование ? - C++
Для чего нужны виртуальные функции и виртуальное наследование ? Я нашел не сколько статей но не все понял. Заранее спасибо!

Объясните для чего нужна строчка? - C++
ВОт прога #include &lt;iostream&gt; using namespace std; int main () { int stringSize; cout &lt;&lt; &quot;Size of string: &quot;; ...

Объясните для чего нужен конструктор - C++
Можете доступно объяснить для чего нужен конструктор, на примере этого кода. #include &lt;iostream&gt; #include &lt;conio.h&gt; #include...

Объясните для чего нужна точка в выражении 1./3 - C++
Здравствуйте!Помогите понять для чего нужна точка в этой формуле (за что она отвечает). z=pow(pow(x,2)-pow(y,2),1./3);Это остаток от...

Объясните пожалуйста! - C++
Всем привет! Нашел код на форуме, который нужен, но не могу разобраться в нем! Программа переводит числа из десятичной в двоичную СС....

5
Evg
Эксперт CАвтор FAQ
17950 / 6181 / 413
Регистрация: 30.03.2009
Сообщений: 16,971
Записей в блоге: 27
29.05.2012, 17:12 #2
Немного гдупый вопрос: а из каких соображений ты считаешь, что это разрешено? И в чём смысл защиты, если любой указатель можно было бы привести к любому типу и залезть в любую закрытую область?
1
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
29.05.2012, 20:28  [ТС] #3
да, про эти 2 до меня уже дошло...действительно глупо вышло...
но начал я так извращаться, пытаясь получить досуп к
C++
1
T* base::data
,
т.к. обращение типа
C++
1
b->data// в методе son<T,D>::son_it::operator*
тоже оказалось неразрешенным...

а вот тут я до сих пор понять не могу...
ведь son_it друг для son, а тот в свою очередь сын base, и для него есть доступ к data...
кроме этого son_it является сыном друга base - сущности it, для которой тоже доступна data...
те выходит, что доступ дается только наследникам всех уровней или прямым друзьям?

с английским туго по этому стандарт понять не всегда удается, я так полагаю, что это именно там обозначено?
0
Evg
Эксперт CАвтор FAQ
17950 / 6181 / 413
Регистрация: 30.03.2009
Сообщений: 16,971
Записей в блоге: 27
29.05.2012, 21:10 #4
Вообще ничего не понял. Правильно поставленный вопрос содержит в себе половину ответа и экономит кучу времени
0
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
29.05.2012, 21:14  [ТС] #5
почему в методе operator *() класса it_son вот такая строчка b->data дает ошибку доступа?
0
Evg
Эксперт CАвтор FAQ
17950 / 6181 / 413
Регистрация: 30.03.2009
Сообщений: 16,971
Записей в блоге: 27
29.05.2012, 23:02 #6
Долго втыкал в пример с экрана. Надоело, засунул в компилятор, чтобы понять, в каком же конкретном месте выдаётся ошибка. Увидел ворох ошибок. Начал их исправлять, тоже надоело. Если человеку впадлу привести свой исходник к нормальному состоянию и выкинуть из него всё несущественное, то мне и подавно впадлу в этом разбираться. Судя по тому, что больше никто в этой теме не ответил, другим людям тоже впадлу.

Извини, если это тебя обидело
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2012, 23:02
Привет! Вот еще темы с ответами:

объясните пожалуйста - C++
как программировать по формуле?

Объясните пожалуйста - C++
Разбор исходного текста на языке программирования. Выделение в исходном коде программы ключевых слов языка и операторов языка по словарю....

Объясните пожалуйста - C++
Как работает эта программа? #include &lt;iostream&gt; using namespace std; int main() { char mas1;

Объясните пожалуйста - C++
char str; int count = 0; cout &lt;&lt; &quot;Enter string:&quot; &lt;&lt; endl; cin.getline(str, 255); for (int i = 0; str; i++) { ...


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

Или воспользуйтесь поиском по форуму:
6
Yandex
Объявления
29.05.2012, 23:02
Ответ Создать тему
Опции темы

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