Non è così che si usa il dynamic_cast.
Esempio:
class Padre {
public:
virtual ~Padre() {} // dynamic_cast richiede almeno una funzione virtuale.
void do_padre() { cout << "padre" << endl;}
};
class Figlio :public Padre {
public:
void do_figlio() { cout << "figlio" << endl; }
};
class Figlia : public Padre {
public:
void do_figlia() { cout << "figlia" << endl; }
};
...
void test(Padre* pater) {
if (pater == nullptr) return;
// funzione comune alla gerarchia.
pater->do_pater();
// ma se provo ad accedere a do_figlio direttamente da pater ho un errore
// di compilazione perché do_figlio non è una funzione della classe Padre.
// uso dynamyc_cast<>.
Figlio* figlio = dynamic_cast<Figlio*>(pater);
// Se il cast fallisce, figlio == nullptr
if (figlio != nullptr) {
// ora posso chiamare do_figlio.
figlio->do_figlio();
}
}
int main( /* etc */) {
Padre* p1 = new Figlio;
Padre* p2 = new Figlia;
test(p1);
test(p2);
delete p1;
delete p2;
}
Attenzione comunque a non esagerare con i dynamic_cast<> è risaputo che sono parecchio lenti.