Dans le code suivant, je peux affecter le retour du D::clone()
à un pointeur sur B
, mais pas un pointeur sur D
. Est-il possible de renvoyer le type polymorphe réel à partir d'un appel du pointeur de base?Erreur de conversion non valide C++ utilisant des types de retour covariant avec des fonctions virtuelles
struct B
{
virtual B * clone() { return this; }
};
struct D : B
{
D * clone()
{
std::cout << std::is_same<decltype(this), D *>::value << std::endl;
return this;
}
};
int main()
{
B * b = new D();
B * bb = b->clone(); // prints "1"
std::cout << std::is_same<decltype(b->clone()), D *>::value << std::endl; // prints "0"
D * d = b->clone(); // error: invalid conversion from B * to D * (GCC 5.1)
}
compilateur est bon -.. Par' b-> clone() 'vous appelez cette fonction' B * B :: clone() 'mais de façon polymorphe, le compilateur verrait le type covariant si' b'était de type D * '- pas de type B *' ... – PiotrNycz