19 янв. 2009 г.

C++: reinterpret_cast и как вызвать private метод

Для начала стоит ознакомиться с const_cast, static_cast, dynamic_cast и reinterpret_cast.

В качестве одного из способов применения рассмотрим один очень не серьёзный, с точки зрения проектирования и использования, пример: обращение к private свойствам / методам некоторого класса.
Вызывать произвольные методы у произвольных классов не получится - необходимо знать интерфейс класса и фактически скопировать его, сделав при этом все его private свойства/методы public.

Итак...
#include <iostream>

// исходный класс, содержащий private метод
class Foo {
private:
virtual void method() const {
std::cout << "this is Foo::method" << std::endl;
}
};

// класс-подмена, который в точности повторяет описание подменяемого класс
// но область видимости - public
class Bar {
public:
virtual void method() const;
};


int main(int argc, char *argv[]) {
Foo *foo = new Foo;

// foo->method(); // compilation error

// подмена типа без проверок и вызов метода
reinterpret_cast<Bar*>(foo)->method();
return 0;
};

И как результат:
$ g++ main.cpp -o main && ./main
this is Foo::method

Обновлено: компилируется и работает точно так же и под msvc (из комплекта ms vs 9.0)

1 комментарий:

Анонимный комментирует...

Отличный пример, спасибо. Последняя ";" лишняя.