Доступ к protected методам из разных классов - потомков.

Тема в разделе "LANGS.C", создана пользователем AshBone, 10 дек 2008.

  1. AshBone

    AshBone New Member

    Публикаций:
    0
    Регистрация:
    12 дек 2007
    Сообщения:
    101
    К примеру, есть такие классы

    class Root

    {

    private:

    .......................


    protected:

    virtual void Method();

    };

    class Derived1 : public Root

    {

    ............

    };

    class Derived2 : public Root

    {

    protected:

    virtual void SomeNewMethod(Derived1* Object) { Object->Method(); }; // ------> Здесь собственно проблема.

    };

    Компиляция в Visual Studio проходит нормально, а вот Borland C++ Builder 6 говорит, что Derived1::Method() недоступен. Может кто знает, где правда ))) В смысле, что об этом говорит стандарт?
     
  2. Clear_Energy

    Clear_Energy Алексей

    Публикаций:
    0
    Регистрация:
    3 ноя 2008
    Сообщения:
    375
    friend - ищи в документации
     
  3. AshBone

    AshBone New Member

    Публикаций:
    0
    Регистрация:
    12 дек 2007
    Сообщения:
    101
    Clear_Energy

    Слушай, я знаю, что такое дружественные конструкции. Дело не в этом. Проблема в том, чтобы создать метод, который могли бы вызывать только классы, производные от Root.
     
  4. Clear_Energy

    Clear_Energy Алексей

    Публикаций:
    0
    Регистрация:
    3 ноя 2008
    Сообщения:
    375
  5. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Код (Text):
    1. class A {
    2. protected:
    3.     void qwe();
    4. };
    5.  
    6. class B : public A{
    7. protected:
    8.     void x() {
    9.         A * a;
    10.                       B * b;
    11.         qwe(); //OK
    12.         a->qwe(); //ошибка
    13.                       b->qwe(); //OK
    14.     }
    15. };
    Задумался.
    Надо курить стандарт....
     
  6. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    AshBone
    Визуал не прав. Если производный класс не друг базового, то так:
    Код (Text):
    1. virtual void SomeNewMethod(Derived1* Object) { Object->Method(); };
    вызывать можно только открытые методы. Даже если Method() объявлен в базовом классе как защищенный. Если друг - то можно.
    Посмотри ISO 14882:2003 11.5.
     
  7. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    scf
    Все верно (см. пост #6). Повторю для данного случая: если B не друг A, то он не имеет право обращаться к a->qwe(), даже если A::qwe() защищенный. b->qwe() можно вне зависимости от дружбы, т.к. главное свойство "protected" именно в этом.
     
  8. AshBone

    AshBone New Member

    Публикаций:
    0
    Регистрация:
    12 дек 2007
    Сообщения:
    101
    meduza

    Спасибо, а то уже большая часть проекта написана, причем так, что компилируется без изменений и в билдере и в студии )))