2012-02-14 1 views
2

포인터가 아닌 객체를 알려진 파생 형식으로 다운 케하는 것이 안전합니까?

class Block : Object {/*Filler*/} 

obj1obj2Block 객체로 보장하는

result Compare(const Osp::Base::Object &obj1, const Osp::Base::Object &obj2, int &cmp) const { 
    cmp = ((const Block)obj1).NumSuperBlocks() - ((const Block)obj2).NumSuperBlocks(); 
} 

슬라이스의 원인이 될 것인가?

내가 사용하는 유혹 해요 :

cmp = ((const Block*)&obj1)->NumSuperBlocks() - ((const Block*)&obj2)->NumSuperBlocks(); 

을하지만 읽기에 SO 전자를 사용하는 나는 유혹하고있어 객체 ​​슬라이스 태그의 간단한 설명입니다. 그러나 나는 정말로 더러운 조용한 조각을 원하지 않는다.

답변

7

참조 및 포인터는 모두 다형성입니다.

당신은 참조로 시작 downcasting에 대한

static_cast<const Block&>(obj1).NumSuperBlocks() 

을 선호 할 수 있습니다, 그것은 *static_cast<const Block*>(&obj1)에 해당합니다.

+1

함수 인자가'const' 인'const 블록 '입니다. – Lol4t0

+0

@BenVoigt : 그래서 포인터와 객체는 여기서 슬라이싱의 유사성과 아무런 차이가 없습니까? TBH, 전자는 더 읽기 쉽고 자연스럽지 않습니다. – John

+0

@ 존 : 여기서 포인터와 참조의 차이는 없습니다. 나는 당신의 원래 코드가 마음에 들지 않는다. 그것은 슬라이스 수 있습니다. 또한 액세스 가능한 복사본 생성자가 필요하며 복사본에 대해 작동합니다. 여기에 참조 또는 포인터를 사용하십시오. –

1

먼저 다운 캐스트 용 C 스타일 캐스트 (또는 모든 캐스팅)를 사용하지 마십시오. 모든 컴파일러 검사를 우회하기 때문에 매우 위험합니다.

그렇다면 참조 또는 포인터 다운 캐스팅시 슬라이스에 대해 걱정할 필요가 없습니다.

다형성 객체 (즉, 가상 메소드가있는 객체)의 경우 동적 유형 변환을 사용하여 컴파일 타임 + 런타임 검사를 제공 할 수 있습니다 (포인터를 잘못된 유형으로 잘못 전 달하거나 null을 반환 할 때 null을 반환 함).) 잘못된 유형 참조 :

Block & block = dynamic_cast<Block&>(obj); 

당신이 static_cast를 사용할 수있는 비 다형성 객체의 경우.

+1

C 스타일의 캐스트는 유형이 관련되어있을 때 (여기에있는 것처럼)'static_cast'처럼 작동하고, 그렇지 않으면'reinterpret_cast'로 작동합니다. 따라서 컴파일러는 오프셋을 처리합니다. 또한'dynamic'은'Object'가'virtual' 멤버 함수를 가지고있을 때만 유효합니다. –

+0

'dynamic_cast'를 사용한다면'NULL'의 결과를 확인하십시오. –

+0

@BenVoigt 정보를 제공해 주셔서 감사합니다. 내 소식을 업데이트하겠습니다. – StackedCrooked

관련 문제