8

Я читаю «Внутри объектной модели C++», пытаясь понять, как многократное и виртуальное наследование достигается через vtables. (Я понимаю, что один полиморфизм отлично-хорошо).Макет памяти класса под множественным или виртуальным наследованием и vtable (ы)?

У меня возникли трудности с пониманием того, что именно делается, когда метод должен быть расположен во время виртуального наследования или во время литья, потому что существует множество расчетов смещения.

Может ли кто-нибудь помочь с пониманием того, как многократные vtables используются в примере с несколькими или виртуальными наследованиями? Если бы я мог понять макет и проблему, я, вероятно, мог бы лучше понять эту проблему.

+0

Когда вы говорите о множественном наследовании, вы имеете в виду последовательные остановки (c наследует от b, который наследуется от a), или вы имеете в виду реальное множественное наследование (c наследуется одновременно от a b)? – Christophe

+0

Возможно, этот вопрос поможет http://stackoverflow.com/q/11603198/1741542 –

ответ

10

Реализации C++ обычно используют vtables для реализации виртуальных функций. Таблица vtable представляет собой таблицу указателей на функции. Каждый объект класса с виртуальными функциями имеет скрытый указатель на vtable, содержащий адреса всех виртуальных функций класса.

При вызове виртуальной функции код вычисляет смещение указателя функции в таблице vtable и вызывает функцию, адрес которой хранится там.

enter image description here

Когда производный класс базового класса overides в virtuall функцию, виртуальная таблица этого класса просто указывает на overidden функции вместо исходной.

Подробнее об этом excellent article explains, как это работает, как для однократного, так и для множественного наследования.

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