実験用のソースは次の感じかな。(>>330の改変)

#include <iostream>
using namespace std;
class A      { public: virtual void func() {cout << "A::func()" << endl;} };
class B: public A { public:     void func() {cout << "B::func()" << endl;} };
class C: public B { public:     void func() {cout << "C::func()" << endl;} };
int main()
{
  A a;
  B b;
  C c;
  A* ar[] = { &a, &b, &c };
  B* br[] = { &b, &c };

  cout << "Call directly" << endl;
  a.func(); b.func(); c.func();

  cout << "Call from A*" << endl;
  ar[0]->func(); ar[1]->func(); ar[2]->func();

  cout << "Call from B*" << endl;
  br[0]->func(); br[1]->func();

  return 0;
}

A* の配列でオーバーライドされてるのは当然として、
B* の配列経由でもオーバーライドされてるのが分かると思う。
少なくとも、手元の環境ではオーバーライドされた。