В качестве одного из способов применения рассмотрим один очень не серьёзный, с точки зрения проектирования и использования, пример: обращение к 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 комментарий:
Отличный пример, спасибо. Последняя ";" лишняя.
Отправить комментарий