Поскольку B :: func НЕ является перегрузкой A :: func и никогда не может быть, независимо от того, что вы делаете.Даже не пытайтесь объявить A :: func виртуальным, потому что вы не можете.Что бы вы ни пытались сделать, вы не можете.Статический и динамический полиморфизм просто не смешивается в C ++.
Если бы ваш указатель был на B *, а не на A *, вы ожидаете, что его версия будет вызываться.