В следующем коде, который я нашел здесь:
http://bloglitb.blogspot.com/2010/07/access-to-private-members-thats-easy.html
кажется, что он переходит прямо через спецификатор частного доступа C ++.Это позволяет мне вызывать частные функции и читать / записывать личные данные членов.
Поиск SO обнаружил эту связанную проблему, которая была подтвержденной ошибкой компилятора GCC
шаблон c ++, кажется, нарушает спецификаторы доступа
Естественно, я попытался использовать тестовый код этого парня.Что было интересно, так это то, что мой компилятор gcc 4.5 действительно имеет эту ошибку (он принимает код и печатает личную информацию), несмотря на то, что об этом сообщалось в gcc 4.3, а я использовал 4.5.
В любом случае, я пошел в Comeauонлайн-компилятор, который некоторые из ответов в ветке сказали, что пытались.Я подтвердил, что Comeau не принимает код из этого вопроса, но принимает мой код ниже.
Итак, в конечном итоге мой вопрос заключается в том, наткнулся ли я на ошибку в GCC и компиляторе Comeau C ++?Это компилируется с VC ++?Если это не ошибка, может кто-нибудь объяснить, как это работает?Я понял, что он может объявить статический указатель на функцию-член и указать его на закрытый раздел, но как это сделать?
Разное: Да, я знаю, что на самом деле это очень, очень плохо.Это также будет работать, если вы объявите ptr данных члена и позволите вам читать / записывать личные данные.Некоторые из странных комментариев были от меня, пытающегося маркировать это для понимания.Я не вызывал в воображении этот код и не возьму на себя ответственность за это.Я только что нашел это в Google.У меня может не хватить очков репутации, чтобы отвечать на комментарии, но я прочитаю все, что вы скажете.Спасибо, что заглянули.
#include <iostream>
using namespace std;
//--------------------------------------------
//
template<typename Tag>
struct result
{
/* export it ... */
typedef typename Tag::type type;
static type ptr;
};
// allocate space for the static member
template<typename Tag>
typename result<Tag>::type result<Tag>::ptr;
//--------------------------------------------
template<typename Tag, typename Tag::type p>
struct rob : result<Tag>
{
/* fill it ... */
struct filler
{
filler() { result<Tag>::ptr = p; }
};
static filler filler_obj;
};
// allocate space for the static member
template<typename Tag, typename Tag::type p>
typename rob<Tag, p>::filler rob<Tag, p>::filler_obj;
//--------------------------------------------
struct A
{
private:
void f()
{
cout << "hey, don't touch me I'm private!" << endl;
}
};
struct Af
{
typedef void(A::*type)();
};
template class rob<Af, &A::f>;
int main()
{
A a;
(a.*result<Af>::ptr)();
}
~> ./a.out эй, не трогай меня, я личный!
~> g ++ - версия g ++ (SUSE Linux) 4.5.0 20100604 [версия gcc-4_5-ветви 160292] Copyright (C) 2010 Free Software Foundation, Inc.