Отойдя от обычного указателя vtable в вашем объекте:
У вашего кода другие проблемы:
A * array = new A[1000];
array[0] = new B();
array[1] = new C();
Проблема, с которой вы столкнулись, - это проблема нарезки.
Вы не можете поместить объект класса B в пространство, зарезервированное для объекта класса A.
Вы просто отрежете часть B (или C) объекта, оставив только часть A.
Что вы хотите сделать. Имеет массив указателей A, чтобы он удерживал каждый элемент указателем.
A** array = new A*[1000];
array[0] = new B();
array[1] = new C();
Теперь у вас есть еще одна проблема разрушения. Хорошо. Это может продолжаться целую вечность.
Увеличение использования короткого ответа: ptr_vector <>
boost:ptr_vector<A> array(1000);
array[0] = new B();
array[1] = new C();
Никогда не выделяйте массив таким образом, если только вам не нужно (это слишком Java, чтобы быть полезным).