К примеру, есть такие классы 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() недоступен. Может кто знает, где правда ))) В смысле, что об этом говорит стандарт?
Clear_Energy Слушай, я знаю, что такое дружественные конструкции. Дело не в этом. Проблема в том, чтобы создать метод, который могли бы вызывать только классы, производные от Root.
Код (Text): class A { protected: void qwe(); }; class B : public A{ protected: void x() { A * a; B * b; qwe(); //OK a->qwe(); //ошибка b->qwe(); //OK } }; Задумался. Надо курить стандарт....
AshBone Визуал не прав. Если производный класс не друг базового, то так: Код (Text): virtual void SomeNewMethod(Derived1* Object) { Object->Method(); }; вызывать можно только открытые методы. Даже если Method() объявлен в базовом классе как защищенный. Если друг - то можно. Посмотри ISO 14882:2003 11.5.
scf Все верно (см. пост #6). Повторю для данного случая: если B не друг A, то он не имеет право обращаться к a->qwe(), даже если A::qwe() защищенный. b->qwe() можно вне зависимости от дружбы, т.к. главное свойство "protected" именно в этом.
meduza Спасибо, а то уже большая часть проекта написана, причем так, что компилируется без изменений и в билдере и в студии )))