24 / 24 / 3
Регистрация: 17.05.2011
Сообщений: 141
1

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

29.05.2012, 16:18. Показов 459. Ответов 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

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2012, 16:18
Ответы с готовыми решениями:

Объясните пожалуйста от чего такая ошибка появилась
Объясните из-за чего. + System - Provider Microsoft-Windows-Kernel-Power ...

Объясните, пожалуйста, для чего Search Protect
Что это,Search Protect? Объяснните,пожалуйста тупому,для чего она.

Объясните, пожалуйста, для чего нужен этот код
SwingUtilities.invokeLater(new Runnable() { public void run() { ... } }); Для...

Смысл задачи не понимаю, с чего вообще начать. Объясните, пожалуйста
Макс, Евгений и Даниил придумали новую игру. У каждого из них есть игральный кубик (на гранях...

5
Evg
Эксперт CАвтор FAQ
21191 / 8208 / 632
Регистрация: 30.03.2009
Сообщений: 22,518
Записей в блоге: 30
29.05.2012, 17:12 2
Немного гдупый вопрос: а из каких соображений ты считаешь, что это разрешено? И в чём смысл защиты, если любой указатель можно было бы привести к любому типу и залезть в любую закрытую область?
1
24 / 24 / 3
Регистрация: 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
21191 / 8208 / 632
Регистрация: 30.03.2009
Сообщений: 22,518
Записей в блоге: 30
29.05.2012, 21:10 4
Вообще ничего не понял. Правильно поставленный вопрос содержит в себе половину ответа и экономит кучу времени
0
24 / 24 / 3
Регистрация: 17.05.2011
Сообщений: 141
29.05.2012, 21:14  [ТС] 5
почему в методе operator *() класса it_son вот такая строчка b->data дает ошибку доступа?
0
Evg
Эксперт CАвтор FAQ
21191 / 8208 / 632
Регистрация: 30.03.2009
Сообщений: 22,518
Записей в блоге: 30
29.05.2012, 23:02 6
Долго втыкал в пример с экрана. Надоело, засунул в компилятор, чтобы понять, в каком же конкретном месте выдаётся ошибка. Увидел ворох ошибок. Начал их исправлять, тоже надоело. Если человеку впадлу привести свой исходник к нормальному состоянию и выкинуть из него всё несущественное, то мне и подавно впадлу в этом разбираться. Судя по тому, что больше никто в этой теме не ответил, другим людям тоже впадлу.

Извини, если это тебя обидело
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.05.2012, 23:02

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Чего-то не разберусь
Как сделать например вот такую простую деталь на лиспе? Я не могу найти нормального материала в...

Объясните пожалуйста, для чего нужны эти энергосберегающие режимы: Cool. & Quiet, C1E, Core C6 State
Плата Gigabyte ga970a ds3p fx, процессор FX8300. Буду очень благодарен, если кто понятно объяснит...

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


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

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

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