Il ne se est produit pour moi que C++ a covariance pointeur et donc vous vous tirer dans laisse la jambe comme ceci:C++ pointeur covariance
struct Base
{
Base() : a(5) {}
int a;
};
struct Child1 : public Base
{
Child1() : b(7) {}
int b;
int bar() { return b;}
};
struct Child2 : public Base
{
Child2(): c(8) {}
int c;
};
int main()
{
Child1 children1[2];
Base * b = children1;
Child2 child2;
b[1] = child2; // <------- now the first element of Child1 array was assigned a value of type Child2
std::cout << children1[0].bar() << children1[1].bar(); // prints 57
}
Est-ce un comportement non défini? Est-il possible de l'empêcher ou au moins avoir un avertissement du compilateur?
J'ai l'habitude d'appeler b [0] l'élément zéro. Et effectivement faire un tableau n'est pas nécessaire. Je peux produire single Child1 child1; Base * b = & enfant1; * b = enfant2; et obtenir le même comportement indéfini, je ne peux pas? – Amomum
Non, ce serait un comportement parfaitement défini. –
@Amomum: Bien sûr, ce n'est pas parce que c'est bien défini que c'est une bonne idée. Cela ne signifie pas non plus qu'il fait ce que vous pensez qu'il fait. –