SlideShare a Scribd company logo
1
2 
Статический и 
динамический 
полиморфизм в C++ 
Дмитрий Леванов 
Ведущий разработчик Крипта
3 
Крипта 
 Отвечает на вопрос «Кто?» 
 Определяет интересы по поведению в 
интернете 
 Используется для таргетинга рекламы 
 От др.-греч. κρυπτή — крытый подземный ход, 
тайник
4 
Как учили Крипту 
+ Логи 
Обучение Контроль 
Матрикснет
5 
Крипта
6 
Разработка Крипты 
 Много логов в разных форматах 
 Сложные цепочки обработки 
 Высокие требования к производительности 
 Много одинаковой похожей логики 
 Хочется делать всё однообразно
7 
Модель распределенных 
вычислений MapReduce 
Дмитрий Леванов 
Ведущий разработчик Крипта
8 
Полиморфизм 
 Способ поставить в соответствие некой 
грамматической конструкции контекстно- 
зависимую семантику 
или, по-русски: 
 Текст программы [почти] один и тот же, а 
смысл разный
9 
Виртуальный полиморфизм 
class Base { 
virtual void do() { std::cout << “base”; } 
}; 
class Derived : public Base { 
virtual void do() { std::cout << “derived”; } 
}; 
Base* b = new Derived(); 
b->do(); // derived
Виртуальный полиморфизм: плюсы 
10 
 ООП-шненько 
 Типобезопасно 
 Работают фичи, зависящие от _vptr
Виртуальный полиморфизм: минусы 
 Медленный вызов методов 
 Надо поддерживать иерархию классов 
 Грабли с виртуальными методами 
 Приходится иметь дело с T* или T& 
 Статический метод не может быть виртуальным 
 Инвариантность 
11
12 
Зачастую все сводится к… 
void f(Handler* h) { 
h->do(); 
} 
//... 
f(new MyHandler());
13 
Зачастую все сводится к… 
void f(Handler* h) { 
h->do(); 
} 
//... 
f(new MyHandler()); 
template<typename H> 
void f(const H& h) { 
h.do(); 
} 
//... 
f(MyHandler());
14 
Продолжаем улучшать 
void f(Handler* h) { 
h->do(); 
} 
//... 
f(new MyHandler()); 
template<typename H> 
void f(const H& h) { 
h(); 
} 
//... 
f(MyHandler());
15 
Вообще хорошо! 
void f(Handler* h) { 
h->do(); 
} 
//... 
f(new MyHandler()); 
template<typename H> 
void f(const H& h) { 
h(); 
} 
//... 
f([]() { /* do */ });
16 
Или так 
void f(Handler* h) { 
h->do(); 
} 
//... 
f(new MyHandler()); 
template<typename H> 
void f() { 
H::do(); 
} 
//... 
f<MyHandler>();
17 
Статический полиморфизм: плюсы 
 Типобезопасно 
 Быстрый вызов методов 
 Не надо наследоваться 
 Не надо иметь дело с указателями 
 Можно использовать лямбды
Статический полиморфизм: минусы 
18 
 Нельзя положить в коллекцию 
 Сложно проверять правильность кода 
 Есть ограничения компилятора 
 Медленно компилируется 
 Может распухнуть бинарник 
 Не во всех IDE правильно работает 
автокомплит
19 
«Виртуальный» вызов без virtual 
a.k.a. Curiously Recurring Template Pattern 
template<typename Derived> 
class Base { 
void do() { 
static_cast<Derived*>(*this)::do(); 
} 
}; 
class MyDerived : public Base<MyDerived> { 
void do() { std::cout << "my derived"; } 
}; 
Base<MyDerived>* b = new MyDerived(); 
b->do(); // my derived
20 
Tag dispatching 
template <class InputIter, class Dist> 
void advance (InputIter& it, Dist n); 
template <class InputIter, class Dist> 
void advance(InputIter& i, Dist n) { 
while (n--) ++i; 
} 
template <class RndAcsIter, class Dist> 
void advance(RndAcsIter& i, Dist n) { 
i += n; 
}
21 
Tag dispatching 
template <class InputIter, class Dist> 
void advance (InputIter& it, Dist n); 
template <class InputIter, class Dist> 
void advance(InputIter& i, Dist n, input_iter_tag) { 
while (n--) ++i; 
} 
template <class RndAcsIter, class Dist> 
void advance(RndAcsIter& i, Dist n, rnd_acs_iter_tag) { 
i += n; 
}
22 
Tag dispatching 
template <class InputIter, class Dist> 
void advance (InputIter& it, Dist n) { 
typename iter_traits<InputIter>::iter_category cat; 
advance(i, n, cat); 
} 
template <class InputIter, class Dist> 
void advance(InputIter& i, Dist n, input_iter_tag) { 
while (n--) ++i; 
} 
template <class RndAcsIter, class Dist> 
void advance(RndAcsIter& i, Dist n, rnd_acs_iter_tag) { 
i += n; 
}
23 
Задача 
 Например, мы пишем дебаггер 
 Есть множество объектов, не связанных 
какой-либо иерархией 
 Хотим сложить их в одну коллекцию, 
проитерироваться по ней, и сдампить объекты 
int x = 10; 
Foo bar; 
objects.add(x); 
objects.add(bar); 
for (const auto& obj : objects) { 
obj.dump(); 
}
24 
External polymorphism 
class Dumpable { 
virtual void dump() const = 0; 
}; 
template<typename T> 
class ConcreteDumpable<T> : public Dumpable { 
const T& value; 
public: 
ConcreteDumpable(const T& value) : value(value) {} 
virtual void dump() const { 
::dump(value); 
} 
}; 
void dump(const Foo& foo) { 
foo.printToConsole(); 
}
25 
External polymorphism 
class Dumper { 
std::vector<Dumpable*> dumpables; 
public: 
template<typename T> 
void add(T& obj) { 
auto dumpable = new ConcreteDumpable<T>(obj); 
dumpables.push_back(dumpable); 
} 
void dumpAll() const { 
for (auto d : dumpables) { d->dump(); } 
} 
} dumper; 
int x = 10; 
Foo bar; 
dumper.add(x); 
dumper.add(foo); 
dumper.dumpAll();
26 
External polymorphism 
 Симбиоз виртуального и статического 
полиморфизма 
 Для поддержки нового типа T надо добавить 
только ::dump(T) 
 Можно строить параллельные иерархии
Новые возможности C++11: лямбды 
27 
int x = 10; 
vector<int> v = { 1, 2, 3 }; 
for_each(v.begin(), v.end(), [x](int i){cout << i+x;}); 
class Lambda { 
int x; 
public: 
Lambda(int x) : x(x) {} 
void operator( )(int i) {cout << i+x;} 
}; 
for_each(Lambda());
Новые возможности C++14: лямбды 
28 
int x = 10; 
vector<int> v = { 1, 2, 3 }; 
for_each(v.begin(), v.end(), [x](auto i){cout << i+x;}); 
class Lambda { 
int x; 
public: 
Lambda(int x) : x(x) {} 
template<typename T> 
void operator( )(T i) {cout << i+x;} 
};
29 
Новые возможности C++11: 
std::function 
using namespace std; 
void print(int i) { cout << i; } 
struct Print { 
void operator()(int i) {cout << i+x;} 
} 
function<void(int)> p1 = print; 
function<void(int)> p1 = Print; 
function<void(int)> p1 = [](int i) {cout << i+x;};
30 
Новые возможности C++11: 
std::function 
using namespace std; 
void print(int i) { cout << i; } 
struct Print { 
void operator()(int i) {cout << i+x;} 
} 
function<void(int)> p1 = print; 
function<void(int)> p1 = Print; 
function<void(int)> p1 = [](int i) {cout << i+x;};
31 
Новые возможности C++11: 
std::function 
 Медленные (virtual под капотом) 
 Обеспечивают поддержку концептов 
 Позволяют сохранить исполняемые объекты 
 Не замена шаблонам и виртуальным методам!
32 
Топ фич (субъективный) 
1. Обычный метод/функция 
2. Шаблонный метод/функция (+лямбды) 
3. Шаблонный класс (+CRTP) 
4. Виртуальный метод 
5. Внешний полиморфизм 
6. std::function
33 
Спасибо за внимание! 
Дмитрий Леванов 
Ведущий разработчик Крипта 
levanov@yandex-team.ru
34 
Источники 
1. http://www.inteks.ru/OOAD/P-Cources.OOAD.part1.pdf 
2. http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern 
3. http://www.cs.wustl.edu/~schmidt/PDF/External-Polymorphism.pdf 
4. http://www.generic-programming.org/languages/cpp/techniques.php 
5. http://eli.thegreenplace.net/2013/12/05/the-cost-of-dynamic-virtual-calls- 
vs-static-crtp-dispatch-in-c/

More Related Content

What's hot

Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Sergey Platonov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Platonov Sergey
 
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Roman Orlov
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Sergey Platonov
 
Конкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнерыКонкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнеры
corehard_by
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Dima Dzuba
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Platonov Sergey
 
тема 2.операторы.линейный алгоритм
тема 2.операторы.линейный алгоритмтема 2.операторы.линейный алгоритм
тема 2.операторы.линейный алгоритмdasha2012
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Dima Dzuba
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Sergey Platonov
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#
Dmitri Soshnikov
 
3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы
DEVTYPE
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8.
Dima Dzuba
 
Cpp/cli types
Cpp/cli typesCpp/cli types
Cpp/cli typesmcroitor
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
Sergey Platonov
 
Как это работает: DLR
Как это работает: DLRКак это работает: DLR
Как это работает: DLR
Mikhail Shcherbakov
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptDmytro Mindra
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
Pavel Tsukanov
 

What's hot (20)

Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
 
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
 
Конкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнерыКонкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнеры
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
 
тема 2.операторы.линейный алгоритм
тема 2.операторы.линейный алгоритмтема 2.операторы.линейный алгоритм
тема 2.операторы.линейный алгоритм
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Python
PythonPython
Python
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#
 
3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8.
 
Cpp/cli types
Cpp/cli typesCpp/cli types
Cpp/cli types
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
Как это работает: DLR
Как это работает: DLRКак это работает: DLR
Как это работает: DLR
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScript
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 

Similar to Статический и динамический полиморфизм в C++, Дмитрий Леванов

Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Yandex
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
Fedor Vompe
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
Mikhail Kurnosov
 
07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно зна...
07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно зна...07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно зна...
07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно зна...
HappyDev-lite
 
2015-04-12 07 Евгений Тюменцев. Зачем программисту нужно знать математику?
2015-04-12 07 Евгений Тюменцев. Зачем программисту нужно знать математику?2015-04-12 07 Евгений Тюменцев. Зачем программисту нужно знать математику?
2015-04-12 07 Евгений Тюменцев. Зачем программисту нужно знать математику?
HappyDev
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
Sergey Schetinin
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?
Yauheni Akhotnikau
 
Cтиль программирования
Cтиль программированияCтиль программирования
Cтиль программирования
Constantin Kichinsky
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
Ontico
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
Fwdays
 
О сложностях программирования, или C# нас не спасет?
О сложностях программирования, или C# нас не спасет?О сложностях программирования, или C# нас не спасет?
О сложностях программирования, или C# нас не спасет?
Tatyanazaxarova
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Yandex
 
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Ontico
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
Andrey Karpov
 
Rust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатноRust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатно
Open-IT
 
Tricky Java Generics
Tricky Java GenericsTricky Java Generics
Tricky Java Generics
Alexander Matorin
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8
chashnikov
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кода
Andrey Karpov
 
Кирилл Харьков
Кирилл ХарьковКирилл Харьков
Кирилл Харьков
CodeFest
 

Similar to Статический и динамический полиморфизм в C++, Дмитрий Леванов (20)

Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
 
07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно зна...
07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно зна...07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно зна...
07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно зна...
 
2015-04-12 07 Евгений Тюменцев. Зачем программисту нужно знать математику?
2015-04-12 07 Евгений Тюменцев. Зачем программисту нужно знать математику?2015-04-12 07 Евгений Тюменцев. Зачем программисту нужно знать математику?
2015-04-12 07 Евгений Тюменцев. Зачем программисту нужно знать математику?
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?
 
Cтиль программирования
Cтиль программированияCтиль программирования
Cтиль программирования
 
лекция 3
лекция 3лекция 3
лекция 3
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
 
О сложностях программирования, или C# нас не спасет?
О сложностях программирования, или C# нас не спасет?О сложностях программирования, или C# нас не спасет?
О сложностях программирования, или C# нас не спасет?
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Rust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатноRust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатно
 
Tricky Java Generics
Tricky Java GenericsTricky Java Generics
Tricky Java Generics
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кода
 
Кирилл Харьков
Кирилл ХарьковКирилл Харьков
Кирилл Харьков
 

More from Yandex

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of Tanks
Yandex
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Yandex
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Yandex
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Yandex
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Yandex
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Yandex
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Yandex
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Yandex
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Yandex
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Yandex
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Yandex
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Yandex
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Yandex
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Yandex
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Yandex
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Yandex
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Yandex
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Yandex
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Yandex
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Yandex
 

More from Yandex (20)

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of Tanks
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
 

Статический и динамический полиморфизм в C++, Дмитрий Леванов

  • 1. 1
  • 2. 2 Статический и динамический полиморфизм в C++ Дмитрий Леванов Ведущий разработчик Крипта
  • 3. 3 Крипта  Отвечает на вопрос «Кто?»  Определяет интересы по поведению в интернете  Используется для таргетинга рекламы  От др.-греч. κρυπτή — крытый подземный ход, тайник
  • 4. 4 Как учили Крипту + Логи Обучение Контроль Матрикснет
  • 6. 6 Разработка Крипты  Много логов в разных форматах  Сложные цепочки обработки  Высокие требования к производительности  Много одинаковой похожей логики  Хочется делать всё однообразно
  • 7. 7 Модель распределенных вычислений MapReduce Дмитрий Леванов Ведущий разработчик Крипта
  • 8. 8 Полиморфизм  Способ поставить в соответствие некой грамматической конструкции контекстно- зависимую семантику или, по-русски:  Текст программы [почти] один и тот же, а смысл разный
  • 9. 9 Виртуальный полиморфизм class Base { virtual void do() { std::cout << “base”; } }; class Derived : public Base { virtual void do() { std::cout << “derived”; } }; Base* b = new Derived(); b->do(); // derived
  • 10. Виртуальный полиморфизм: плюсы 10  ООП-шненько  Типобезопасно  Работают фичи, зависящие от _vptr
  • 11. Виртуальный полиморфизм: минусы  Медленный вызов методов  Надо поддерживать иерархию классов  Грабли с виртуальными методами  Приходится иметь дело с T* или T&  Статический метод не может быть виртуальным  Инвариантность 11
  • 12. 12 Зачастую все сводится к… void f(Handler* h) { h->do(); } //... f(new MyHandler());
  • 13. 13 Зачастую все сводится к… void f(Handler* h) { h->do(); } //... f(new MyHandler()); template<typename H> void f(const H& h) { h.do(); } //... f(MyHandler());
  • 14. 14 Продолжаем улучшать void f(Handler* h) { h->do(); } //... f(new MyHandler()); template<typename H> void f(const H& h) { h(); } //... f(MyHandler());
  • 15. 15 Вообще хорошо! void f(Handler* h) { h->do(); } //... f(new MyHandler()); template<typename H> void f(const H& h) { h(); } //... f([]() { /* do */ });
  • 16. 16 Или так void f(Handler* h) { h->do(); } //... f(new MyHandler()); template<typename H> void f() { H::do(); } //... f<MyHandler>();
  • 17. 17 Статический полиморфизм: плюсы  Типобезопасно  Быстрый вызов методов  Не надо наследоваться  Не надо иметь дело с указателями  Можно использовать лямбды
  • 18. Статический полиморфизм: минусы 18  Нельзя положить в коллекцию  Сложно проверять правильность кода  Есть ограничения компилятора  Медленно компилируется  Может распухнуть бинарник  Не во всех IDE правильно работает автокомплит
  • 19. 19 «Виртуальный» вызов без virtual a.k.a. Curiously Recurring Template Pattern template<typename Derived> class Base { void do() { static_cast<Derived*>(*this)::do(); } }; class MyDerived : public Base<MyDerived> { void do() { std::cout << "my derived"; } }; Base<MyDerived>* b = new MyDerived(); b->do(); // my derived
  • 20. 20 Tag dispatching template <class InputIter, class Dist> void advance (InputIter& it, Dist n); template <class InputIter, class Dist> void advance(InputIter& i, Dist n) { while (n--) ++i; } template <class RndAcsIter, class Dist> void advance(RndAcsIter& i, Dist n) { i += n; }
  • 21. 21 Tag dispatching template <class InputIter, class Dist> void advance (InputIter& it, Dist n); template <class InputIter, class Dist> void advance(InputIter& i, Dist n, input_iter_tag) { while (n--) ++i; } template <class RndAcsIter, class Dist> void advance(RndAcsIter& i, Dist n, rnd_acs_iter_tag) { i += n; }
  • 22. 22 Tag dispatching template <class InputIter, class Dist> void advance (InputIter& it, Dist n) { typename iter_traits<InputIter>::iter_category cat; advance(i, n, cat); } template <class InputIter, class Dist> void advance(InputIter& i, Dist n, input_iter_tag) { while (n--) ++i; } template <class RndAcsIter, class Dist> void advance(RndAcsIter& i, Dist n, rnd_acs_iter_tag) { i += n; }
  • 23. 23 Задача  Например, мы пишем дебаггер  Есть множество объектов, не связанных какой-либо иерархией  Хотим сложить их в одну коллекцию, проитерироваться по ней, и сдампить объекты int x = 10; Foo bar; objects.add(x); objects.add(bar); for (const auto& obj : objects) { obj.dump(); }
  • 24. 24 External polymorphism class Dumpable { virtual void dump() const = 0; }; template<typename T> class ConcreteDumpable<T> : public Dumpable { const T& value; public: ConcreteDumpable(const T& value) : value(value) {} virtual void dump() const { ::dump(value); } }; void dump(const Foo& foo) { foo.printToConsole(); }
  • 25. 25 External polymorphism class Dumper { std::vector<Dumpable*> dumpables; public: template<typename T> void add(T& obj) { auto dumpable = new ConcreteDumpable<T>(obj); dumpables.push_back(dumpable); } void dumpAll() const { for (auto d : dumpables) { d->dump(); } } } dumper; int x = 10; Foo bar; dumper.add(x); dumper.add(foo); dumper.dumpAll();
  • 26. 26 External polymorphism  Симбиоз виртуального и статического полиморфизма  Для поддержки нового типа T надо добавить только ::dump(T)  Можно строить параллельные иерархии
  • 27. Новые возможности C++11: лямбды 27 int x = 10; vector<int> v = { 1, 2, 3 }; for_each(v.begin(), v.end(), [x](int i){cout << i+x;}); class Lambda { int x; public: Lambda(int x) : x(x) {} void operator( )(int i) {cout << i+x;} }; for_each(Lambda());
  • 28. Новые возможности C++14: лямбды 28 int x = 10; vector<int> v = { 1, 2, 3 }; for_each(v.begin(), v.end(), [x](auto i){cout << i+x;}); class Lambda { int x; public: Lambda(int x) : x(x) {} template<typename T> void operator( )(T i) {cout << i+x;} };
  • 29. 29 Новые возможности C++11: std::function using namespace std; void print(int i) { cout << i; } struct Print { void operator()(int i) {cout << i+x;} } function<void(int)> p1 = print; function<void(int)> p1 = Print; function<void(int)> p1 = [](int i) {cout << i+x;};
  • 30. 30 Новые возможности C++11: std::function using namespace std; void print(int i) { cout << i; } struct Print { void operator()(int i) {cout << i+x;} } function<void(int)> p1 = print; function<void(int)> p1 = Print; function<void(int)> p1 = [](int i) {cout << i+x;};
  • 31. 31 Новые возможности C++11: std::function  Медленные (virtual под капотом)  Обеспечивают поддержку концептов  Позволяют сохранить исполняемые объекты  Не замена шаблонам и виртуальным методам!
  • 32. 32 Топ фич (субъективный) 1. Обычный метод/функция 2. Шаблонный метод/функция (+лямбды) 3. Шаблонный класс (+CRTP) 4. Виртуальный метод 5. Внешний полиморфизм 6. std::function
  • 33. 33 Спасибо за внимание! Дмитрий Леванов Ведущий разработчик Крипта levanov@yandex-team.ru
  • 34. 34 Источники 1. http://www.inteks.ru/OOAD/P-Cources.OOAD.part1.pdf 2. http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern 3. http://www.cs.wustl.edu/~schmidt/PDF/External-Polymorphism.pdf 4. http://www.generic-programming.org/languages/cpp/techniques.php 5. http://eli.thegreenplace.net/2013/12/05/the-cost-of-dynamic-virtual-calls- vs-static-crtp-dispatch-in-c/