2017-09-28 8 views
0

Imaginez le Childs pour chiens et chats des animaux avec ces constructeurs de copie:C de la référence à l'enfant inhereting dans parent abstrait

class Animal 
{ 
    public: 
    Animal(??? other); 
} 

class Dog : Animal 
{ 
    public: 
    Dog(Dog& other); 
} 

class Cat : Animal 
{ 
    public: 
    Cat(Cat& other); 
} 

Que dois-je écrire pour le ??? dans la classe animale mère pour permettre aux constructeurs suivants :

Cat cat(otherCat); 
Dog dog(otherDog); 

Mais pas ce que ce serait avec Animal&:

Cat cat(otherDog); 
Dog dog(otherCat); 
+0

Serait-il possible d'avoir aucun constructeur accepter animal super classe? Alors seulement les constructeurs de sous-classe seront appelés –

+0

tout d'abord, si vous avez affaire à C++ vous avez manqué un ':' après le mot-clé 'public'. Deuxièmement, vous pouvez juste mettre 'otherAnimal' là, puisque les constructeurs ne sont pas hérités – Fureeish

+0

Si vous donnez' Cat' un 'Cat', que voulez-vous finir? – doctorlove

Répondre

4

Vous venez de prendre un Animal&/const Animal& dans le constructeur de copie de Animal. Cela ne fera pas fonctionner Cat cat(otherDog); car seul le constructeur de copie de Cat est considéré. Si vous décommentez Dog dog(cat); le code suivant ne compilera pas.

class Animal 
{ 
    public: 
    Animal(const Animal& other) {} 
    Animal() {} 
}; 

class Dog : Animal 
{ 
    public: 
    Dog(const Dog& other) : Animal(other) {} 
    Dog() {} 
}; 


class Cat : Animal 
{ 
    public: 
    Cat(const Cat& other) : Animal(other) {} 
    Cat() {} 
}; 

int main() 
{ 
    Cat cat; 
    Cat other(cat); 
    //Dog dog(cat); 
} 

Live Example

+0

Est-ce que cela s'applique uniquement aux constructeurs? Que se passe-t-il si j'ai une fonction speakTo (otherAnimal) afin que les chats ne puissent parler qu'aux chats et aux chiens? – Schokocrossi

+0

@Schokocrossi Yes-ish, les constructeurs ne sont pas hérités et si vous écrivez une fonction avec le même nom dans une classe dérivée que la classe de base, la fonction de classe dérivée cachera la classe de base un. – NathanOliver