После копания в ассемблерный код в emit по GCC 4.8
GCC сгенерирует два куска кода (для класса, деструктор которого является виртуальным):
One is assembly snippet#1 for {Destructor + Dealloc}
The other is assembly snippet#2 for {Destructor only}
И для классачей деструктор не является виртуальным, инструкция функции освобождения вызова сгенерирует в точке, где вы вызываете delete.
(В следующем обсуждении предполагается, что деструктор является виртуальным)И если ваш код выглядит следующим образом:
p->C::~C() // this will be translate to call snippet#2
Таким образом, функция освобождения связывается вместе с виртуальным деструктором.Поэтому я думаю, что это ответит на ваш вопрос о том, как функция deallocate реализована как виртуальная, так и статическая.