![]() |
Виртуальные функции(vtable)
Добрый день. Вот разбираюсь с виртуальными функциями. На сколько я понял, в начале класса, в котором есть виртуальные методы, делается указатель на таблицу(vtable), в которой хранятся указатели на функции конкретного класса. Теперь вопрос - если класс наследуется от двух других классов с виртуальными методами, то в нем будут хранится две таблицы(по 1 на каждого виртуального предка)? И что бы кастануть наш класс к любому из предков, надо юзать dynamic_cast<>?
|
Про то, как обычно оно устроено (советую прочитать все лекции - это перевернёт и упорядочит твой мир):
http://www.stanford.edu/class/archiv...2/Slides12.pdf Про то, для чего и что может dynamic_cast (имхо лучше им не злоупотреблять): http://msdn.microsoft.com/en-us/library/cby9kycs.aspx Как правило любой dynamic_cast начинается с прыжка в базовый класс, а дальше поиск кандидата по всем дочерним классам. |
pva, спасибо, чтиво интереснейшее. Сам я работаю на Java, и для меня привычно, когда абсолютно все что можно, скрыто за интерфейсами, и простым кастом можно привести объект наследника к одному из нескольких интерфейсов. А в с++, как оказалось, не все так просто:). Вот что получилось у меня:
Код:
class i1 Код:
Action* v = dynamic_cast<Action*>(с); UPD: хотя, скорее всего, в других ситуациях dynamic_cast выдаст более навороченый код, чем в данном случае. |
Демонстрация static_cast, dynamic_cast
Код:
class i1 { Код:
foo() |
Время: 04:47. |
Время: 04:47.
© OSzone.net 2001-