Цитата:
Сообщение от Inoniemi
Я тут задумался, как решается ситуация с множественным наследованием. По идее возможно два подхода. Можно строить какую-то единственную "обобщенную" таблицу виртуальных функций и иметь только один указатель на нее (что уменьшает размер структуры и упрощает поиск в ней). Либо можно иметь в структуре N (по количеству базовых классов) указателей на различные виртуальные таблицы (что увеличивает размер структуры на N * sizeof(pointer)). В gcc, судя по размерам производного класса, выбрали вариант с N указателями, любопытно достаточно... Надеюсь там не приходится динамически искать методы в каждой из виртуальных таблиц.
|
Я думаю, что с одним указателем в принципе, не очень получится. Обычно компиляторы имеют какую-то глобальную таблицу с адресами виртуальных функций и любой класс, который имеет их в определении, просто получает значение со смещением в начало занимаемой им области в этой таблице. В случае со множественным наследованием, скажем, два родительских класса могут быть виртуальными и они оба должны хранить свои индивидуальные значения со смещением. Другое дело, если наследование виртуальное: тогда смещение снова будет одно. По идее, как-то так.
|