Ответ на первый вопрос прост: инструкция написана во время компиляции. Компилятор, очевидно, не будет знать, было ли это значение удалено или нет, поэтому он просто слепо копирует значение pC
сверх ppA
.
Ответ на ваш второй вопрос: он может не работать. Вы вошли в страшную землю с неопределенным поведением. Подумайте, Алиса в Стране Чудес, без кота, который вас поведет.
Обычно, когда вы вызываете operator delete
по указателю, вы говорите ОС, что при необходимости она может перезаписать память. "Если нужно. Фактического стирания памяти не происходит, просто обещание, что вы больше не будете использовать этот блок памяти.
Таким образом, когда вы пытаетесь получить доступ к виртуальной таблице для вызова func1
, данные все еще могут быть там. Или нет. В этом случае вы получите сбой (если вам повезет). Но вы это заслужили, вы нарушили свое обещание ОС, поэтому в этот момент все идет хорошо.
Редактировать: Обратите внимание, что func1
на самом деле никогда не использует this
, поэтому, если бы он не был виртуальным, вы могли бы сказать ((A*)0)->func1()
, и он бы работал нормально.