Это, вероятно, обычная избыточность программирования. Я заметил DECLSPEC_NOVTABLE (__declspec (novtable)) на связке интерфейсов, определенных в заголовках:
struct DECLSPEC_NOVTABLE IStuff : public IObject
{
virtual method1 () = 0;
virtual method2 () = 0;
};
В статье MSDN об этом расширенном атрибуте __declspec говорится, что добавление этого парня удалит записи vtable конструкции и дескриптора и, следовательно, приведет к "значительному уменьшению размера кода" (поскольку vtable будет полностью удален).
Это просто не имеет особого смысла для меня. Эти ребята чисто виртуальные, почему бы компилятору не сделать это по умолчанию?
В статье также говорится, что если вы сделаете это, а затем попытаетесь создать одну из этих вещей, вы получите нарушение прав доступа во время выполнения. Но когда я попробовал это с несколькими компиляторами (с расширением __declspec или без него), они не компилируются (как я и ожидал).
Итак, я думаю, чтобы подвести итог:
- Компилятор удаляет vtable независимо от чисто виртуальных интерфейсов, или я пропустил что-то фундаментальное здесь?
- О чем говорится в статье MSDN?