question polimorphisme

a marqué ce sujet comme résolu.

Bonjours, je suis le cours c++ du sites et je me pose une question : Pourquoi quand on declare un std::vector<std::unique_ptr<A>> A etant une classe, on peut mettre n’importe quelle classe héritant de A dans le std::vector mais quand on fait un std::vector<std::unique_ptr<B>> avec B héritant de A on ne puisse pas donner se std::vector a une fonction qui attend un std::vector<std::unique_ptr<A>>

je suis désolé si sa peut paraitre confus Je m’excuse pour les fautes d’orthographe si il y en a.

Si l’argument n’est pas passé par pointeur ou par référence (si le type de l’argument est vector<unique_ptr<A>> et pas vector<unique_ptr<A>>& ou vector<unique_ptr<A>>*), alors l’argument est copié. Or copier un vector implique de copier ses éléments, et les unique_ptr ne peuvent pas être copiés, par principe.

Je sais pas si c’est clair.

Édit. : en général, t’as pas envie de passer un vector par copie, puisque ça peut être coûteux pour rien. On les passe habituellement par référence.

Du point de vu du compilateur, std::vector<std::unique_ptr<A>> et std::vector<std::unique_ptr<B>> sont deux types bien différents, et le second n’hérite simplement pas du premier.

Passer le vector par référence ne résoudra pas le problème. Une solution serait d’écrire une fonction template:

template<typename T, typename = std::enable_if_t<std::is_base_of_v<A, T>>>
void func(const std::vector<T> & v)
{
    // ...
}

Bonjour,

Les pointeurs intelligents gèrent très bien le polymorphisme. Ce qui ne peut pas le gérer ce sont les collections, c’est ce qui t’a été dit.

Si tu as un plateaux de pommes et un plateau de pommes rouge, c’est différent. Tu peux mettre une pomme rouge dans le plateau de pommes. Le réceptacle prévu pour une pomme ne va pas poser de problème (c’est le pointeur intelligent). Quand tu t’intéresses à une unique pomme il n’a pas de problème. Mais si tu passes le plateau de pommes rouges à quelqu’un en lui disant c’est un plateau de pommes, il risque fort d’y caser une golden. Les deux types de plateaux sont différents. On ne peut pas utiliser l’abstraction avec des collections.

Si tu as un plateaux de pommes et un plateau de pommes rouge, c’est différent. Tu peux mettre une pomme rouge dans le plateau de pommes. Le réceptacle prévu pour une pomme ne va pas poser de problème (c’est le pointeur intelligent). Quand tu t’intéresses à une unique pomme il n’a pas de problème. Mais si tu passes le plateau de pommes rouges à quelqu’un en lui disant c’est un plateau de pommes, il risque fort d’y caser une golden. Les deux types de plateaux sont différents. On ne peut pas utiliser l’abstraction avec des collections.

dalfab

o_O Génial! J’adore!

Bonjour à tous, j’ai un problème avec VSC, à peine j’ouvre un fichier, il m’indique erreur includepath, mettre à jour includepath, tidles désactivé. J’ai vu que quelqu 'un a une solution sous Ubuntu, moi c' est sous Windows 10. Merci pour toute aide, Michel B.

Bonjour @bollemi,

Merci de créer ton propre sujet pour poser une question.

Aussi, tu devrais prendre connaissance de Comment poser une question sur le forum afin de t’aider dans ta démarche.

Bonne journée.

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte