Поделиться через


vtordisp

Блок, относящийся только к языку C++

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

#pragma vtordisp([push,] n)
#pragma vtordisp(pop)
#pragma vtordisp()
#pragma vtordisp([push,] {on | off})

Параметры

  • push
    Отправляет текущее значение vtordisp во внутренний стек компилятора и устанавливает для vtordisp новое значение n. Если n не указано, текущее значение vtordisp не меняется.

  • pop
    Удаляет верхнюю запись из внутреннего стека компилятора и восстанавливает удаленное значение vtordisp.

  • n
    Определяет новое значение vtordisp. Возможны значения 0, 1 или 2, соответствующие параметрам компилятора /vd0, /vd1 и /vd2. Дополнительные сведения см. в разделе /vd (отключение смещений при выполнении конструктора).

  • on
    Аналогично параметру #pragma vtordisp(1).

  • off
    Аналогично параметру #pragma vtordisp(0).

Заметки

Директива #pragma vtordisp применяется только к коду, в котором используются виртуальные базовые классы. Если в производном классе переопределена виртуальная функция, которую он унаследовал от виртуального базового класса, и если конструктор или деструктор производного класса вызывает эту функцию при помощи указателя на виртуальный базовый класс, то компилятор может вставлять поля vtordisp в классы с виртуальными базовыми классами.

Директива #pragma vtordisp влияет на структуру классов, которые ей следуют. Параметры /vd0, /vd1 и /vd2 определяют аналогичное поведение для целых модулей. Если задано значение 0 или off, то добавление скрытых членов vtordisp отключается. Директиву #pragma vtordisp рекомендуется отключать только в тех случаях, когда конструкторы и деструкторы класса гарантированно не смогут вызывать виртуальные функции объекта, на который указывает указатель this.

Если задано значение по умолчанию 1 или on, то скрытые члены vtordisp добавляются там, где они необходимы.

Если указано значение 2, то скрытые члены vtordisp добавляются ко всем виртуальным базовым классам с виртуальными функциями. Значение vtordisp(2) может быть необходимым для того, чтобы оператор dynamic_cast правильно применялся к частично сконструированным объектам. Дополнительные сведения см. в разделе Предупреждение компилятора (уровень 1) C4436.

Директива #pragma vtordisp() без аргументов восстанавливает исходное значение vtordisp.

#pragma vtordisp(push, 2)
class GetReal : virtual public VBase { ... };
#pragma vtordisp(pop)

Завершение блока, относящегося только к языку C++

См. также

Ссылки

Директивы Pragma и ключевое слово __Pragma