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

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

Восстановить пароль Регистрация
 
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
29.05.2012, 16:18     Наследование. я чего-то не разберусь с доступом.объясните пожалуйста #1
Суть в том, что есть 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....
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2012, 16:18     Наследование. я чего-то не разберусь с доступом.объясните пожалуйста
Посмотрите здесь:

C++ Объясните про наследование
Объясните пожалуйста C++
C++ Объясните, для чего нужны некоторые строчки в коде(using namespace, new, int main)
Объясните для чего нужна строчка? C++
Объясните пожалуйста C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,129
Записей в блоге: 26
29.05.2012, 17:12     Наследование. я чего-то не разберусь с доступом.объясните пожалуйста #2
Немного гдупый вопрос: а из каких соображений ты считаешь, что это разрешено? И в чём смысл защиты, если любой указатель можно было бы привести к любому типу и залезть в любую закрытую область?
Глупец
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...
те выходит, что доступ дается только наследникам всех уровней или прямым друзьям?

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

Извини, если это тебя обидело
Yandex
Объявления
29.05.2012, 23:02     Наследование. я чего-то не разберусь с доступом.объясните пожалуйста
Ответ Создать тему
Опции темы

Текущее время: 18:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru