Проблема с локальными статическими переменными. Соответствует ли это стандарту?
Как выяснилось (после 2 часов отладки вперемежку с нецензурной руганью) статические переменные a, b оказались одними и теми же (хранятся по одному адресу) для всех объектов классов B, C, D.
Разве они не должны быть в каждом объекте класса разными? 
Начнём с того, что эти переменные вообще не принадлежат объекту. Это локальные переменные функции. А функция у вас определена одна единственная, A::func. B и C унаследовали это определение, своих функций func у них нет.
Ключевое слово static как раз предназначено для того чтобы переменная вела себя как глобальная. Почему бы вам не объявить обычный член класса А, тогда он будет принадлежать экземпляру класса?