32bit_me (32bit_me) wrote,
32bit_me
32bit_me

Category:

Паттерн статического полиморфизма

Паттерном статического полиморфизма называется конструкция вида:

template<class T> class Base
{
...
};
 
class Derived: public Base<Derived>
{
...
};
 



Для чего она нужна? Очевидно, для того, чтобы обеспечить полиморфное поведение без накладных расходов на таблицу виртуальных методов.

Рассмотрим пример:

#include <stdio.h>
#include <iostream>
 
template<class T> class Base
{
    private:
      T* virt() {return static_cast<T*>(this);}
    public:
    void foo()
    {
        virt()->bar();
    }
};
 
class Derived1: public Base<Derived1>
{
    public:
    void bar()
    {
        std::cout << "Derived1::bar()\n";
    }
};
 
class Derived2: public Base<Derived2>
{
    public:
    void bar()
    {
        std::cout << "Derived2::bar()\n";
    }
};
 
int main()
{
    Derived1 derived1;
    Derived2 derived2;
    derived1.foo();
    derived2.foo();
    return 0;
}
 


Здесь мы вызываем "виртуальную" (на самом деле нет) функцию bar() из функции базового класса foo(). Фактически будет вызываться Derived1::bar() или Derived2::bar(), в зависимости от того, какому классу принадлежит экземпляр объекта.

Запустить код можно здесь: https://onlinegdb.com/SyOb-bkRU
Tags: #include, c++, программирование
Subscribe

  • Flang - новый компилятор Fortran

    Flang - новый компилятор Fortran на основе LLVM. Интересно, что Fortran жив до сих пор, а ведь он был впервые представлен в 1957 году. Последняя…

  • Книги

    Ретрокниги:

  • GitHub Desktop

    GitHub Desktop - очень прикольная штука. Ставите и забываете cli и git bash (если вы под виндой). Хотя и в cli нет ничего сложного, но GitHub Desktop…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 4 comments