Re[2]: ATL_NO_VTABLE и все такое..
От: Ivan Россия www.rsdn.ru
Дата: 11.11.04 15:33
Оценка: 4 (1)
Здравствуйте, NKZ, Вы писали:

NKZ>Сам же __declspec(novtable) подавляет генерацию vtable в класcе следовательно ты не можешь вызывать виртуальные функций этого класса из производного.


не совсем так. или совсем не так __declspec(novtable) действительно подавляет генерацию vtable путем удаления кода из конструкторов и деструткора, который инициализирует vptr — указатель на vtbl. Но смысл отключения vtbl совсем в другом — если известно, что экземпляр класса никогда не будет создан, то нет необходимости и в vtbl для этого класса.

Пример, классы для ATL-компонентов, которые генерирует визард, объявляются с ATL_NO_VTABLE, так как реально для класса CX создается экземпляр класса CComObject<CX>( он унаследован от CX ).

Никаких побочных эффектов от использования novtable нет — до тех пор пока не создать экземпляр класса, который объявлен с этим модификатором и вызвать виртуальную функцию.

> Обычно ATL_NO_VTABLE ставят на последний класс в цепочке наследования.

Соотв-но нельзя использовать в последнем классе в цепочке наследования — максимум на предпоследнем
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.