Это никогда не происходило со мной, что с ++ имеет указатель ковариации и, следовательно, позволяет снимать себя в ногу, как это:C++ указатель ковариационная
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
}
ли это неопределенное поведение? Есть ли способ предотвратить это или, по крайней мере, иметь предупреждение от компилятора?
Я привык вызывать b [0] нулевой элемент. И фактически создание массива не обязательно. Я могу создать отдельный Child1 child1; База * b = & child1; * b = child2; и получить такое же неопределенное поведение, не так ли? – Amomum
Нет, это было бы совершенно определенное поведение. –
@Amomum: Конечно, только потому, что он хорошо определен, это не значит, что это хорошая идея. Это также не означает, что он делает то, что, по вашему мнению, делает. –