Шаблонная виртуальность (Parameterized Virtuality)
Помимо использования С++ интересно использовать трюки, которые позволяет этот язык. Одним из таких трюков является Parameterized Virtuality(C++ Templates: The Complete Guide By David Vandevoorde, Nicolai M. Josuttis).
Параметризированная виртуальность позволяет указывать будет ли использоваться механизм виртуальных функций при работе с иерархией классов.
Для этого использутся два класса:
view plainprint?
struct not_virtual_type {};
struct virtual_type
{
virtual void method() {}
};
Далее, определяется базовый класс иерархии:
view plainprint?
template< class vbase >
struct base: private vbase
{
void method() {}
};
И класс наследник:
view plainprint?
template< class type >
struct derived: public base<type>
{
void method();
};
Теперь, при использовании класса derived мы можем указать, использовать ли виртуальность. Это делается следующим образом:
view plainprint?
template< class T >
void test(base< T >& t)
{
t.method();
}
view plainprint?
base< not_virtual_type >* ptr = new derived< not_virtual_type >;
test(*ptr); // здесь вызывается base::method()
delete ptr;
base< virtual_type >* vptr = new derived< virtual_type >;
test(*vptr); // здесь вызывается derived::method()
delete vptr;
-----------
Very sexy young pornstars wait for you at Sharpmovies.com!
Хочешь узнать, где находятся самые аппетитные проститутки? Заходи на Sexrelax.ru!
Два мужика снимались в порно 12 часов без остановки! Что стало с ними после смотри на big-sex.ru.