2010-03-09 2 views
14

При обсуждении закрытых классов термин «таблица виртуальных функций» упоминается довольно часто. Что именно это? Я читал о таблице методов некоторое время назад (я не помню цели цели этого), а google/search здесь приводит к связанным с C++ результатам.Таблицы виртуальных методов

Благодаря

ответ

4

Таблица виртуальных функций C# работает в основном так же, как C++ один, так что любые ресурсы, которые описывают, как C++ функция таблица работы виртуальных поможет вам очень хорошо с C# один, а также.

Например, Wikipedia's description не является плохим.

0

Определение таблицы виртуальных функций (часто называемое vtable) одинаково для C# и C++. Эта таблица поиска используется внутри среды выполнения для достижения полиморфного поведения абстрактного/виртуального/переопределенного метода.

В простой форме вы можете представить, что базовый класс с виртуальным методомA будет иметь таблицу vtable, которая содержит метод A. Когда метод переопределения класса класса А, vtable для метода А наследует от родительского класса, но теперь указывает на метод А в производном классе, а не на родительский.

19

«Таблица виртуальных функций» или «таблица виртуальных методов» - это список указателей методов, которые имеют каждый класс. Он содержит указатели на виртуальные методы в классе.

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

Если вы, например, иметь ссылку на объект в строку:

object obj = "asdf"; 

и вызвать виртуальный метод ToString:

string text = obj.ToString(); 

он будет использовать метод String.ToString, а не объекта. Метод ToString. Он использует таблицу виртуальных методов класса String (на которую указывает указатель в экземпляре строки), а не таблицу виртуальных методов класса Object.

+0

Правильно ли я понимаю, что «таблица методов» создается для любого типа. Таким образом, тип значения также имеет «таблицу методов». И еще один вопрос: как получить тип, который имеет «таблицу методов»? Является ли «таблица методов» сохранена или указана в типе-объекте? Но тип значения не имеет указателя типа объекта. :/Вот связанный с этим вопрос: http://stackoverflow.com/questions/35185528/does-a-value-type-keep-type-pointer-sync-root-static-fields-like-a-reference/35185851# 35185851 – Spirit

+2

@Spirit: Да, у каждого типа есть таблица методов (по крайней мере, в некоторой форме на каком-то этапе). Поскольку вызовы типов значений не являются виртуальными, точные методы определяются во время компиляции, поэтому им не нужна таблица виртуальных методов, для них она должна существовать только в исполняемом файле для целей отражения. Я не знаю, где фактически хранятся таблицы методов, которые будут зависящими от реализации, поэтому вы будете искать в исходном коде рамки для этого (однако эта часть реализации может быть не публичной). – Guffa

+0

Спасибо. Ваш ответ на ваш вопрос очень ясен. Я, наконец, нашел аналогичную дискуссию SO: http://stackoverflow.com/questions/926352/how-is-valuetype-gettype-able-to-determine-the-type-of-the-struct – Spirit

Смежные вопросы