class A { public: void nonvirt (); virtual void virt (); } class B : public A { public: void nonvirt (); void virt (); } A a; B b; A *ap = &b; B *bp = &b; bp->nonvirt (); // вызывает B::nonvirt, как вы и ожидали ap->nonvirt (); // вызывает A::nonvirt, даже хотя это и объект типа B ap->virt (); // вызывает B::virt, корректная версия процедуры для объектов класса B