Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Давайте еще скажем, что кто-то не знал, что компилятору с -O3 или -Ofast вообще всё равно на ООП.
#define protected public
# include <external_header>
#undef protectedauto x = &A::f;Тогда еще можно встроенный ассемблер призвать на помощь, ну и еще немного разврату — мы люди без комплексов, можем и знаем толк как потрогать неприкасаемое так что б приятно компилируемо было.
#include <iostream>
using namespace std;
class A
{
int t;
void printT()
{
cout<<"t="<<t<<endl;
};
int alpha()
{
cout<<this<<"->alpha()"<<endl;
this->printT();
return 0;
}
public:
A():t(0){;}
void setT(int _){this->t = _;}
};
class B
{
virtual int beta()
{
cout<<this<<"->beta()"<<endl;
return 0;
}
public:
virtual void gamma(){};
};
class C:public B
{
public:
int beta(){return 0;};
private:
void gamma(){cout<<"Private function of class C "<<this<<"->gamma() called"<<endl;}
};
int main()
{
A e;
e.setT(800);
__asm
{
lea edx, A::alpha
lea ecx, e
call edx
}
C* e2 = (C*)new B;
e2->beta();
delete e2;
B* e3 = new C;
e3->gamma();
delete e3;
return 0;
}
Это в студии 2008 работало.
Если в классе есть хоть один шаблонный метод, то можно и private-члены вытащить, написав его специализацию для какого-нибудь dummy-типа. Выйдет еще "красивее".
class A
{
protected:
void f() {}
};
class B: public A
{
public:
A::f;
};
int main()
{
B b;
b.f();
return 0;
}
class A
{
protected:
int f() { return 0; }
};
class B : public A
{
public:
using A::f;
};
A a;
static_cast<B&>(a).f();
class B: public A {
public: using A::f;
};
static int _f(A &a){ return (a.*&B::f)(); }
В студии работает и A::f вместо B::f.Проверил в 2015-й:
static int _f(A &a){ return (a.*&A::f)(); }test.cpp(8): error C2248: 'A::f': cannot access protected member declared in class 'A'static int _f нужно поместить внутрь класса B. Но от создания лишнего класса не уходим ((class TBase {};
class Target : public TBase {
protected: int target_function(){ return 5; }
};
class Base {
private: TBase *tbase;
public: Base(TBase *t) : tbase(t) {}
};
class Main : public Base {
private: Target t;
public:
Main() : Base(&t) {}
const Target &getTarget(){ return t; }
};
int main(){
Main m;
int val = m.getTarget().target_function(); //нужно получить это
}
Красиво «взламываем» ООП с помощью C++14