Пример полиморфизма в C++ на основе ООП

Пример полиморфизма в C++ на основе ООП

Полиморфизм — один из основных приемов создания гибкой архитектуры приложений. Он обеспечивает повторное использование и расширяемость существующей кодовой базы. В C++ полиморфизм реализуется несколькими способами.

Здесь мы рассмотрим пример использования полиморфизма в C++, основанный на объектно-ориентированном программировании и применении виртуальных функций. Виртуальными называют такие функции-члены, которые могут быть переопределены в классах-наследниках.

Допустим, мы разрабатываем мультимедийную библиотеку для работы с веб-камерами. Для этого мы создаем класс WebCamera:

Воспользоваться этим классом можно следующим образом:

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

Обратите внимание, что для трансляции видео-потока используется паттерн Наблюдатель.

Все выглядит неплохо. Но предположим, что в какой-то момент появилась необходимость обеспечить поддержку еще одного типа камер, которые используют специфический драйвер и не поддерживаются текущей реализацией WebCamera. Можно изменить реализацию класса WebCamera, вставив условные конструкции с ветвлением по типу камеры. Но такая архитектура окажется довольно громоздкой и неудобной для сопровождения. Гораздо лучше воспользоваться полиморфизмом.

Сразу возникает желание создать абстрактный класс на подобии AbstractCamera. Но не стоит спешить. Устройств ввода потоков кадров очень много. И не все они являются камерами. Например, может потребоваться добавить поддержку электронного микроскопа. Или возникнет необходимость получать кадры с сетевой веб-камеры из интернета. Чтобы воспользоваться преимуществами повторного использования, лучше заранее предусмотреть и эти случаи, выбрав в качестве имени для базового класса AbstractVideoStream:

Концепция класса AbstractVideoStream немного отличается от WebCamera, но аналогия легко прослеживается. Не забывайте, что класс, предназначенный для наследования, должен иметь виртуальный деструктор, иначе могут возникнуть утечки памяти. Также не забывайте про ключевое слово virtual перед объявлением функций-членов. Поскольку осмысленную реализацию для абстрактного класса видео-потока предусмотреть довольно сложно, объявим функции-члены чисто виртуальными, добавив в конце объявления = 0.

Сделаем WebCamera наследником AbstractVideoStream:

В пользовательском коде предпочтительно везде использовать указатели на AbstractVideoStream, а не на конкретные подклассы:

В VideoPlayer тоже должен использоваться указатель на AbstractVideoStream:

Теперь класс VideoPlayer может работать с любыми источниками видео-потоков. За счет полиморфизма приложение стало значительно проще расширять. Любой может сам добавить поддержку своего типа видео-потока даже не имея исходных кодов библиотеки.

Представленный пример использует вариацию паттерна Стратегия. Более конкретный пример этого паттерна мы рассматривали, когда говорили о потоках в Qt.

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (Пока оценок нет)
Загрузка...
Понравилась статья? Поделиться с друзьями:
Добавить комментарий