C++ удивил (MSVC 2008)
От: Аноним  
Дата: 01.11.09 19:20
Оценка:
class   base
{
private:
    base*   parent;
public:
    base*   get_parent() { return parent; }
protected:
    void    test_protected() {};
};

class   derived_A : public base
{
public:
    void    test() {
        test_protected(); //OK
        get_parent()->test_protected(); error C2248: 'base::test_protected' : cannot access protected member declared in class 'base'
    }
};


int _tmain(int argc, _TCHAR* argv[])
{
    derived_A a;
    a.test();
    return 0;
}


Не пойму почему так, ведь по сути один и тот же класс.
А что делать если надо?
Re: C++ удивил (MSVC 2008)
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 01.11.09 19:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Не пойму почему так, ведь по сути один и тот же класс.

Так ты же его извне вызываешь.

А>А что делать если надо?

friend'ом сделать derived_A можно для base. Поможет. Но не нужно.
Re[2]: C++ удивил (MSVC 2008)
От: nen777w  
Дата: 01.11.09 19:53
Оценка:
А>>Не пойму почему так, ведь по сути один и тот же класс.
N>Так ты же его извне вызываешь.

Я почему то всегда думал что для одного и того же типа правила видимости рояля не играют.
Оказывается что уже в унаследованных классах это правила не работают.

Ведь так всё ок получается:

class   base
{
private:
    base*   parent;
public:
    base*   get_parent() { return parent; }

     Вот так работает это понятно....
    void    test( base* p ) {
        p->test_protected();
    }

protected:
    void    test_protected() {};
};

class   derived_A : public base
{
public:
    void    test() {
        test_protected();

        // можно такой хак сделать, но тоже не красиво
        dynamic_cast<derived_A*>(get_parent())->test_protected();
    }
};
Re: C++ удивил (MSVC 2008)
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 01.11.09 23:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Не пойму почему так, ведь по сути один и тот же класс.


Нет, классы разные.

А>А что делать если надо?


Устранять ошибку проектирования.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re: C++ удивил (MSVC 2008)
От: Bell Россия  
Дата: 02.11.09 03:13
Оценка:
Здравствуйте, Аноним, Вы писали:

Посмотри здесь
Автор: Gregory
Дата: 22.01.03
Любите книгу — источник знаний (с) М.Горький
Re: C++ удивил (MSVC 2008)
От: abrec Россия  
Дата: 02.11.09 08:02
Оценка:
Здравствуйте, Аноним, Вы писали:

class   base
{
private:
    base*   parent;
public:
    base*   get_parent() { return parent; }
protected:
    void    test_protected() {};
};

class   derived_A : public base
{
public:
    void    test() {
        test_protected(); //OK
        base::test_protected();
    }
};


А>int _tmain(int argc, _TCHAR* argv[])
А>{
А>    derived_A a;
А>    a.test();
А>    return 0;
А>}
А>


А>Не пойму почему так, ведь по сути один и тот же класс.

А>А что делать если надо?
Re[2]: C++ удивил (MSVC 2008)
От: abrec Россия  
Дата: 02.11.09 08:05
Оценка:
Здравствуйте, abrec, Вы писали:

Ступил. Не то
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.