Es fiel nie, dass c mir ++ Zeiger Kovarianz hat und damit man sich in das Bein wie folgt schießen lässt:C++ Zeiger Kovarianz
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
}
Ist es ein nicht definiertes Verhalten? Gibt es eine Möglichkeit, dies zu verhindern oder zumindest eine Warnung vom Compiler zu erhalten?
Ich bin es gewohnt, b [0] das Nullelement zu nennen. Und tatsächlich ist das Erstellen eines Arrays nicht notwendig. Ich kann einzelne Child1 child1 produzieren; Basis * b = & child1; * b = Kind2; und bekomme das gleiche undefinierte Verhalten, kann ich nicht? – Amomum
Nein, das wäre ein perfekt definiertes Verhalten. –
@Amomum: Natürlich, nur weil es gut definiert ist, bedeutet es nicht, dass es eine gute Idee ist. Es bedeutet auch nicht, dass es tut, was du denkst. –