Je suis tombé sur un bout de code où typeid
est utilisé pour obtenir le type d'un unique_ptr
pointant vers un objet polymorphe.
class B{virtual void foo()= 0;};
class D:public B{void foo() override{}};
int main()
{
unique_ptr<B> bd = make_unique<D>();
if (typeid(*bd) != typeid(bd.get()))
{
cout<<"Object types are not same"<<endl;
}
cout<<"Type name of *bd.name(): "<<typeid(*bd).name()<<endl;
cout<<"Type name of bd.get().name(): "<<typeid(bd.get()).name()<<endl;
}
La sortie est :
Object types are not of same
Type name of *bd.name(): 1D
Type name of bd.get().name(): P1B
La sortie de name()
est différent pour get() et le déréférencement avec *. Une autre observation est que lorsqu'il n'y a aucune fonction virtuelle définie dans la classe [sans void foo()
dans l'exemple ci-dessus], les deux get() et * impriment la même sortie.
Questions :
Pourquoi les fonctions get() et * donnent des résultats différents lorsqu'il n'y a pas de fonctions virtuelles dans la classe ?
Exemple vivant : https://gcc.godbolt.org/z/Tiy-Cn
EDIT-1 Conformément à * sur un unique_ptr il est dit "Renvoie l'objet possédé par *this, équivalent à *get()."