par , 15/03/2021 à 14h43 (1212 Affichages)
Bonjour,
j'ai voulu savoir comment on fait une méthode polymorphe avec shared_ptr, mais je n'ai pas trouvé mon bonheur. J'ai donc dû expérimenter diverse technique, infructueuses. Alors voici mes conclusions:
Voici deux classe B et C qui héritent d'une classe A, avec, dans celle-ci, une méthode virtuelle pure (évidement, on est pas obligé de rendre la classe A abstraite) :
classes.hpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
class A{
public:
virtual void quelObjet()=0;
};
class B:public A{
public:
void quelObjet()override;
};
class C:public A{
public:
void quelObjet()override;
}; |
classes.cpp
1 2 3 4 5 6 7 8 9 10
| #include <iostream>
#include "classes.hpp"
void B::quelObjet(){
std::cout<<"objet B"<<std::endl;
}
void C::quelObjet(){
std::cout<<"objet C"<<std::endl;
} |
et main.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include <memory>
#include <vector>
#include "classes.hpp"
int main(){
std::vector<std::shared_ptr<A>>V;
auto b=std::shared_ptr<A>(new B);
auto c=std::shared_ptr<A>(new C);
b->quelObjet();
c->quelObjet();
V.push_back(b);
V.push_back(c);
V[0]->quelObjet();
V[1]->quelObjet();
} |
lorsque l'on exécute tout ça, on obtient bien:
1 2 3 4
| objet B
objet C
objet B
objet C |
les appels "b->quelObjet()" et "V[0]->quelObjet()" sont bien les appels de "quelObjet()" de la classe B et les appels "c->quelObjet()" et "V[1]->quelObjet" les appels de "quelObjet()" de la classe C