Skip to content

Instantly share code, notes, and snippets.

@mildred
Created March 11, 2014 13:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mildred/9485620 to your computer and use it in GitHub Desktop.
Save mildred/9485620 to your computer and use it in GitHub Desktop.
Break C++ encapsulation
class A {
template<class T> class B {};
template<class T> friend class C;
int priv;
protected:
int pro;
};
template<typename T, typename U>
class Access : public T {
protected:
static U& access(T& o) { return static_cast<U&>(o); }
};
class D : public Access<A, D> {
static int toto() {
A a;
D &b = static_cast<D&>(a);
return b.pro + access(a).pro;
}
int tata() {
A a;
return access(a).pro;
}
};
template<class T> class C {
};
namespace {
struct X__20 {};
}
template<> class A::B<X__20> {
static int toto() {
A a;
return a.priv;
}
};
template<> class C<X__20> {
static int toto() {
A a;
return a.priv;
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment