Перейти к содержанию

Рекомендуемые сообщения

Вот такую интересную вещь встретил:

#include <iostream>

class A 
{
   private:
      void pf(void)
      {
         std::cout << "Wabadam!!";
      }
   public:
      typedef void (A::*ptrf)(void);
      ptrf gimmi()
      {
         return &A::pf;
      }
};

int main(int, char**) 
{
   A a;
   A::ptrf f = a.gimmi();
   (a.*f)();
}

Как считаете, скомпилируется ли? Если да, то будет ли работать? Не будет ли ошибки доступа к private-функции класса? Просьба отвечать без компилятора, это всего лишь задачка.

© LuckLess

Ссылка на комментарий
Поделиться на другие сайты

в принципе смысл разрешить такой доступ есть, в редких случаях его можно эффективно использовать - должно скомпилироваться, к тому же метод класса это не код, а всего лишь его адресс, так что если ошибка и произойдет то на этапе компиляции ptrf gimmi() возвращающей поинтер на приватный метод класса.

Ссылка на комментарий
Поделиться на другие сайты

Имхо, должно собраться. Приватный он в случае, если производится попытка вызова его напрямую, а что касается адресов - то подобные проверки вряд ли компиляторами производятся, поскольку должны приводить к усложнению алгоритма компиляции и соответственно к увеличению времени компиляции. А зачем это делать?

Ссылка на комментарий
Поделиться на другие сайты

Byte писал(а) Сбт, 10 Июня 2006 01:13

а где здесь непосредственный доступ к private-функции класса?

именно что нигде, а зная оффсет и объект, функцию может вызвать любой, и зависнуть ничего не может.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...