Exemple

class Base {
public:
void fnc();
};

class Derived: public Base {
public:
void fnc(){}
};

int main(){
Derived d;

Base *basePtr = &d;
Derived *derivedPtr = &d;

basePtr->fnc();// appelle Base::fnc()
derivedPtr->fnc();  // appelle Derived::fnc()

return 0;
}

Solution
Ne remplacez pas les fonctions non virtuelles. Modifiez votre construction de façon à ne pas utiliser la classe de base, ou bien virtualisez la fonction de la classe de base virtuelle afin d'assurer un comportement polymorphique.


class Base {
public:
virtual void fnc();
};

class Derived: public Base {
public:
void fnc(){}
};

int main(){
Derived d;

Base *basePtr = &d;
Derived *derivedPtr = &d;

basePtr->fnc();// appelle 
Derived::fnc()
derivedPtr->fnc();  // appelle Derived::fnc()

return 0;
}