그것은 나에게 포인터 공분산을 가지고 ++이 C를 발생하지 따라서이 같은 다리에 자신을 촬영할 수 있습니다 : 그것은 정의되지 않은 행동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 : 물론 정의가 잘되어 있다고해서 좋은 생각이 들지는 않습니다. 당신이 생각하는대로 행동한다는 의미도 아닙니다. –