Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Указатели на функции-члены и наследование
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Непомнящий Евгений
Код

class Base
{
protected:
    typedef void (Base::*PBaseFunc)();

    void f1();

    void doAction(PBaseFunc func);
};

class Derived : public Base
{
protected:
    void func()
    {
        doAction(&Base::f1);
    }
};

Выдает ошибку:
doAction(&Base::f1);
^
"main.cpp",139 Error[Pe410]: protected function "Base::f1" is not accessible through a "Base" pointer or object.
Если в Base f1 сделать public - все ок. Не пойму, почему protected-функцию нельзя вызвать через указатель в производном классе.
alexander55
Цитата(Непомнящий Евгений @ Nov 19 2007, 11:12) *
Не пойму, почему protected-функцию нельзя вызвать через указатель в производном классе.

А разве это возможно ?
Наследуйте base как
class Derived : protected base
Непомнящий Евгений
Разобрался: вот так doAction(&Derived::f1) работает.
alexander55
Цитата(Непомнящий Евгений @ Nov 19 2007, 13:20) *
Разобрался: вот так doAction(&Derived::f1) работает.
Похоже, извне класса (даже в наследнике) через Base:: доступны только открытые члены.

Я не понял, предложенный вариант заработал. Да или нет ?
dxp
Цитата(Непомнящий Евгений @ Nov 19 2007, 16:20) *
Разобрался: вот так doAction(&Derived::f1) работает.

ISO/IEC
14882
Programming languages — C++
Цитата
11.5 Protected member access [class.protected]
1 When a friend or a member function of a derived class references a protected nonstatic member function or protected nonstatic data member of a base class, an access check applies in addition to those described earlier in clause 11. Except when forming a pointer to member (5.3.1), the access must be through a pointer to, reference to, or object of the derived class itself (or any class derived from that class) (5.2.5). If the access is to form a pointer to member, the nested-name-specifier shall name the derived class (or any class derived from that class).
Непомнящий Евгений
Цитата(alexander55 @ Nov 19 2007, 13:26) *
Я не понял, предложенный вариант заработал. Да или нет ?

В смысле - предложенный вами (protected вместо public)? - Нет.


Цитата(dxp @ Nov 20 2007, 07:54) *


Спасибо. Надо бы почитать стандарт smile.gif Пока Страуструпом обходился
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.