реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Указатели на функции-члены и наследование
Непомнящий Евген...
сообщение Nov 19 2007, 08:12
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Код

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-функцию нельзя вызвать через указатель в производном классе.
Go to the top of the page
 
+Quote Post
alexander55
сообщение Nov 19 2007, 08:40
Сообщение #2


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(Непомнящий Евгений @ Nov 19 2007, 11:12) *
Не пойму, почему protected-функцию нельзя вызвать через указатель в производном классе.

А разве это возможно ?
Наследуйте base как
class Derived : protected base
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Nov 19 2007, 10:20
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Разобрался: вот так doAction(&Derived::f1) работает.
Go to the top of the page
 
+Quote Post
alexander55
сообщение Nov 19 2007, 10:26
Сообщение #4


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



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

Я не понял, предложенный вариант заработал. Да или нет ?
Go to the top of the page
 
+Quote Post
dxp
сообщение Nov 20 2007, 04:54
Сообщение #5


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Непомнящий Евгений @ 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).


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Nov 20 2007, 05:06
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(alexander55 @ Nov 19 2007, 13:26) *
Я не понял, предложенный вариант заработал. Да или нет ?

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


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


Спасибо. Надо бы почитать стандарт smile.gif Пока Страуструпом обходился
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.0139 секунд с 7
ELECTRONIX ©2004-2016