Пример

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


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


void call
DerivedFunction(Base *ptr){

Derived *dp = (Derived*) ptr;
dp->fnc();

}

Решение
Не допускайте преобразования указателя одного класса к указателю класса, не являющегося для него родительским. Во избежание ошибок, не используйте указатели в операциях нисходящего преобразования типов. Вместо этого используйте виртуальные функции.

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


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


void callDerivedFunction
(Base *ptr){

ptr->fnc();

}