Если предположить, что это не виртуальные функции, вы бы использовали больше память с указателями функций.
Первый пример
Нетвыделение (сверх базовой суммы, необходимой для того, чтобы new
возвращал уникальные указатели, или ваша дополнительная реализация, которую вы ...
эллипсировали).
Не виртуальные функции-члены в основном являются статическими функциями, принимающими указатель this
.
Преимущество состоит в том, что ваши объекты действительно просты, и у вас будет только одно место, где можно найти соответствующий код.
Недостатком является то, что вы теряете некоторую гибкость и вынужденывпихните весь свой код в одну функцию обновления / отрисовки.Это будет трудно сделать для чего угодно, кроме крошечной игры.
Второй пример
Вы выделяете 2x указателя на экземпляр объекта.Обычно указатели имеют размер от 4x до 8x байт (в зависимости от вашей целевой платформы и вашего компилятора).
Преимущество в том, что вы получаете большую гибкость, когда вы можете изменять функцию, на которую вы указываете, во время выполнения. и может иметь множество функций, которые его реализуют - таким образом, поддерживая (но не гарантируя) лучшую организацию кода.
Недостатком является то, что будет сложнее сказать, на какую функцию будет указывать каждый экземпляр, когдавы отлаживаете свое приложение или просто читаете код.
Другие параметры
Использование указателей на функции таким специфическим способом (элементы данных экземпляра) обычноимеет больше смысла в простом C и меньше смысла в C ++.
Если вы хотите, чтобы эти функции были связаны во время выполнения, вы можете вместо этого сделать их virtual
.Стоимость зависит от компилятора / реализации, но я считаю, что (как правило) это будет один указатель v-таблицы на экземпляр объекта.
Кроме того, вы можете в полной мере использовать синтаксис виртуальной функции, чтобы ваши функции основывались натип, а не то, что вы их связали.Это будет легче отлаживать, чем параметр указателя функции, поскольку вы можете просто посмотреть на производный тип, чтобы выяснить, на какую функцию указывает конкретный экземпляр.
Вам также не придется инициализировать эти указатели на функции -система типов C ++ будет выполнять эквивалентную инициализацию автоматически (путем создания v-таблицы и инициализации указателя v-таблицы каждого экземпляра).
См .: http://www.parashift.com/c++-faq-lite/virtual-functions.html