Esempio

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

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

int main(){
Derived d;

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

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

return 0;
}

Soluzione
Non sovrascrivere funzioni non virtuali. Modificare il design in modo da non utilizzare  la classe di base oppure rendere la funzione della classe di base virtuale in modo da garantire un comportamento polimorfico.


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();//calls 
Derived::fnc()
derivedPtr->fnc();  //calls Derived::fnc()

return 0;
}