Passer les sous-classes d'une fonction qui prend leur super-classe

Disons que j'ai trois classes - Animal, Cat et Dog, où Cat et Dog sont des sous-classes de Animal (cela ne sonne comme la première des conférences, mais ce n'est pas de devoirs, je le promets, tout en simplifiant le code réel)

Dog* spike = new Dog(); 
Cat* puss = new Cat();   

int main(int argc, char** argv)
{
    function(spike, puss);
    return 0;
}

void function(Animal *pet, Animal *pet2)
{
   magic->andSoForth();
}

Maintenant cela génère l'erreur suivante:

Cannot convert parameter 1 from 'Dog *' to 'Animal'
  No constructor could take the source type,
    or constructor overload resolution was ambiguous

De changer les paramètres pour correspondre exactement génère des erreurs similaires, mais seulement qu'il dit qu'il ne peut pas convertir à partir d'une classe à la même classe.

J'ai appelé avec succès les fonctions de sous-classes et les membres qu'ils héritent de la classe mère, donc je sais que ce qui, logiquement, devrait fonctionner. Je ne sais pas dans quel tordu de manière à ce langage envie de me plier à la logique.

MODIFIER

Solution arrive d'être: les pointeurs de confondre tout le monde.

  • Déclarer des pointeurs.
  • Envoyer des pointeurs comme des arguments à une fonction qui ne gère PAS les pointeurs.

Dans mon exemple, j'ai envoyé le "pas de pointeurs" à la fonction qui voulait les pointeurs, j'ai tout juste de passer. Maintenant, il fonctionne très bien.

Vérifié l'historique de l'édition — la première version avait Dog spike mais ensuite été modifié pour Dog* spike. C'était probablement erronée au début, mais vu la code incorrect dans la question est essentielle pour comprendre la différence entre elle et corriger le code dans la réponse. Quelqu'un peut-il expliquer pourquoi de ce changement qui s'est passé et a été la meilleure réponse donnée fondées sur elle ou sur la première version de la question?

OriginalL'auteur XistenZ | 2012-12-02