2016-09-25 3 views
2

하위 개체를 할당하는 올바른 방법은 무엇입니까? 예를 들면 :하위 개체 할당

struct A { 
    int x = 2; 
    int y = 3; 
}; 

struct B: A { 
    int z = 5; 
}; 

int main() { 
    std::unique_ptr<B> bp{new B{}}; 
    A a; 
    a.x = 12; 
    a.y = 13; 
    *(static_cast<A*>(bp.get())) = a; // happens to work, but is it the right way? 
    std::cout << bp->x << " " << bp->y << std::endl; 
    return 0; 
} 

이 작동 (또는 작동됩니까?)하지만, 어색하고 B의 레이아웃에 대한 가정에 의존한다. 그래서 올바른 방법은 무엇입니까?

답변

2

이 약간 더 관용적 수 있습니다 그렇다. 일반적으로 캐스팅을 더 많이 피할 수는 있지만 캐스팅을 명시 적으로 사용하면 예외적 인 작업을 수행하는 것이 분명해집니다.

+0

왜 그렇게 특이한가요? 또한 명시 적 캐스트가이 경우 작동하도록 보장됩니까? – AlwaysLearning

+0

@AlwaysLearning : 왜 그런지 정확하게 말하기는 어렵지만 제 경험상 이례적인 것은 아닙니다. 일반적으로 상속을 사용하는 경우 개체 상태에 대한 추상화를 수행하려고합니다. –

+1

@AlwaysLearning : x, y, z 멤버를 사용하면 직교 좌표를 모델링하려고한다고 생각합니다. 상속을 사용하면 3D 좌표가 올바른 모델이 아닌 2D 좌표임을 효과적으로 나타낼 수 있습니다. 어쩌면 그것은 의도가 아니었을 것입니다. –

3

일반적으로 하위 개체는 할당하지 않습니다. 개념 상 잘못되어 상속이 어떻게 작동해야하는지에 위배됩니다. 이 필요한 경우, 아마 당신은 잘못된 추상화가 정말 구성이 원하는 : 열심히 그래서

bp->A::operator=(a); 

는 것은 이런 종류의,하지만 매우 드문 :

struct B { 
    A a; 
}; 

std::unique_ptr<B> bp{new B{}}; 
A a{12, 13}; 
bp->a = a; 
+0

"개념적으로 잘못되어 상속이 어떻게 작동해야하는지에 위배됩니다"에 대해 자세히 설명해 주시겠습니까? – AlwaysLearning