виртуальная функция == указатель на функцию? - PullRequest
4 голосов
/ 23 мая 2010

Набор функциональных указателей сгруппирован в структуру данных часто упоминается как виртуальная функция стол (VFT).

Приведенное выше утверждение заставляет меня чувствовать, что virtual function == function pointer, это так?

Ответы [ 7 ]

5 голосов
/ 23 мая 2010

В C. нет встроенной поддержки виртуальных функций.

В C ++ виртуальные функции указываются через v-table .И записи в vtable могут быть реализованы как указатели функций.

2 голосов
/ 23 мая 2010

Это неправильно, потому что это разные уровни абстракции.

Может помочь аналогия: сказать, что виртуальные функции и указатели функций идентичны, все равно, что сказать, что колеса и велосипеды идентичны.

Хотя правда, что указатели на функции и виртуальные функции могут выглядеть «под капотом», они разные, и концептуально (виртуальная функция - это переопределяемый метод члена класса, в то время как указатель на функцию - просто косвенное указание). функции) и синтаксически (их вызов совершенно другой).

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

1 голос
/ 23 мая 2010

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

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

Ничто в вышеприведенном не имеет ссылок на какие-либо "указатели на функции". Однако в типичной реализации для реализации правильного поведения динамических вызовов используется таблица с указателями функций (указывающими на виртуальные функции). Эта таблица называется «VMT», «VFT» или «vtable».

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

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

1 голос
/ 23 мая 2010

На самом деле C ++ поддерживает виртуальные функции, но C не поддерживает VF, потому что оба понятия совершенно разные

1 голос
/ 23 мая 2010

Да, таблица виртуальных функций часто реализуется в виде таблицы указателей функций. Однако есть и другое оборудование, которое можно использовать вместе с таблицей указателей, чтобы сделать функции фактически «виртуальными». У вас должен быть механизм для привязки вызова к правильному указателю во время выполнения и т. Д. Я говорю это, потому что было бы неправильно думать, что, поскольку виртуальная функция является указателем функции на самом базовом уровне, который делает любой указатель на функцию виртуальная функция.

1 голос
/ 23 мая 2010

Я бы сказал, близко, но не совсем. Виртуальная функция все еще является функцией, но обычно она вызывается через указатель, а не напрямую.

0 голосов
/ 23 мая 2010

Я догадался, что это из книги «Понимание сетевых ресурсов Linux» - мы говорим здесь о C, и у вас неверные скобки - это virtual (function table), а не (virtual function) table :). Виртуальные функции - это только термин C ++.

Что не означает, что вы не можете кодировать ООП в ANSI C ...

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