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