Mi intrometto perchè sto approfondendo in questo periodo le gerarchie di classi e il loro utilizzo, quindi può servire come conferma delle mie conoscenze (giuste o sbagliate )

Prendiamo il codice che hai postato e analizziamo questa riga:

Animal b = new Dog();

Il problema nasce perchè Animal non conosce il metodo bark che è contenuto nella classe Dog

per ovviare a questo problema (sia in PHP che in Java) esiste la funziona "instanceof"

ad esempio if (b instanceof Dog) ritorna true se b è un elemento di tipo Dog
una volta effettuato il controllo non ti resta che creare una nuova variabile di tipo Dog che punta all'oggetto b

spero di non aver detto fesserie o almeno di essermi sbagliato di poco.. siete liberi di correggermi! (premetto che sono andato totalmente a memoria e non ho testato ciò che ho scritto.. quindi al 99% ho sbagliato qualcosa comunque guardati bene instanceof e vedrai che una soluzione la trovi da solo!