C
деструктор неявно виртуален, так как по крайней мере один из его базовых деструкторов является виртуальным.
Таким образом, поскольку деструктор C
является виртуальным и вы удаляете через указатель на C
, будет вызван деструктор D
.
Если деструктор A
или B
не будет виртуальным, удаление объекта D
будет неопределенным, но здесь это не так.
Если класс C
является производным от класса (классов), то он знает, как уничтожить свои базовые классы. Таким образом, B
деструктор будет вызываться всегда (при условии, что вы удаляете либо конечный объект, либо с уровня, где деструктор является виртуальным, явно или неявно.
На практике, даже в неопределенном случае (только деструктор D
является виртуальным и объект удаляется с помощью указателя C
), деструктор B
, вероятно, был бы вызван, но часть D
не была бы должным образом уничтожена , Но поскольку он не определен, вы не можете полагаться на это .