Виртуальные функции и обратные вызовы - PullRequest
5 голосов
/ 06 апреля 2011

Рассмотрим сценарий, в котором есть два класса: базовый и производный.Если Базовый класс хочет вызвать функцию производного класса, он может сделать это либо путем создания виртуальной функции и определения этого VF в производном классе, либо с помощью callbacks .Я хочу знать, что должно быть предпочтительным из двух?Выбор из двух зависит от того, какие ситуации / условия?

РЕДАКТИРОВАТЬ: Разъяснение вопроса:

Ситуация, о которой я говорил,базовый класс, который получает сообщения.Эти различные сообщения должны обрабатываться по-разному производным классом, поэтому один из способов - создать виртуальную функцию и позволить производному классу реализовать ее, обрабатывая каждое сообщение при помощи различных вариантов переключения.

Другой способ - реализоватьобратные вызовы через указатели на функции (указывающие на функции производного класса) внутри шаблонов (шаблоны необходимы для обработки объекта производного класса и имен функций).Шаблоны и указатели функций будут находиться в базовом классе.

Ответы [ 3 ]

4 голосов
/ 06 апреля 2011

Я думаю, что это сводится к решению о том, относится ли поведение, о котором вы говорите, к иерархии, о которой «Базовая» знает и которая реализует дочерний элемент.

Если вы используете решение обратного вызова, то метод обратного вызова (в зависимости от подписи) не должен быть реализован в дочернем элементе Base. Это может быть уместно, если, например, вы хотите сказать «это событие произошло» «слушателю события», который может находиться в производном классе или в совершенно не связанном классе, который заинтересован в событии.

Если вы используете решение для виртуальных функций, то вы более тесно связываете внедрение классов Derived и Base.

Интересное чтение, которое может дать ответ на ваш вопрос: Обратные вызовы в C ++ , в которых говорится об использовании Функторов. В Wikipedia также есть пример, который использует шаблонный обратный вызов для сортировки. Вы заметите, что реализация для обратного вызова (который является функцией сравнения) не обязательно должна быть в объекте, который выполняет сортировку. Если бы это было реализовано с использованием виртуальных методов, это было бы не так.

4 голосов
/ 06 апреля 2011

Виртуальный вызов функции является на самом деле обратным вызовом.

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

Виртуальные функции - это способ взаимодействия в иерархии наследования.

1 голос
/ 06 апреля 2011

Я не думаю, что два описываемых вами случая сопоставимы.Виртуальные функции - это инструмент полиморфизма, который помогает вам расширить базовый класс, чтобы обеспечить дополнительную функциональность.Ключевой характеристикой их является то, что решение о том, какая функция будет вызываться, принимается во время выполнения.

Обратные вызовы - это более общая концепция, которая не применяется только к отношениям класса Parent-Child.

Итак, если вы хотите расширить базовый класс, я бы, конечно,с виртуальными функциями.Однако убедитесь, что вы понимаете, как работают виртуальные функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...