Шаблонная виртуальность (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.

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru
  • Опыты со SWIG’ом: C++ код и Ruby
  • Внешне указатели, сокеты внутри
  • Существуют ли конструкторы копирования???
  • Оставить комментарий