2011-04-14 3 views
9

: 당신은 위의 경우에 어떤 캐스트를 필요로하지 않는C++ :베이스 포인터와 파생 클래스 비교 등이 하나의 경우 포인터를 비교했을 때 나는 몇 가지 정보에 대한 모범 사례를 싶습니다

class Base { 
}; 

class Derived 
    : public Base { 
}; 

Derived* d = new Derived; 
Base* b = dynamic_cast<Base*>(d); 

// When comparing the two pointers should I cast them 
// to the same type or does it not even matter? 
bool theSame = b == d; 
// Or, bool theSame = dynamic_cast<Derived*>(b) == d? 

답변

5

는 안전한 내기 그들을 다형성하고 dynamic_cast

class Base { 
    virtual ~Base() { } 
}; 

class Derived 
    : public Base { 
}; 

Derived* d = new Derived; 
Base* b = dynamic_cast<Base*>(d); 

// When comparing the two pointers should I cast them 
// to the same type or does it not even matter? 
bool theSame = dynamic_cast<void*>(b) == dynamic_cast<void*>(d); 

가 때때로 당신이 기본 클래스에 파생에서 static_cast 또는 암시 적 변환을 사용할 수 없습니다 고려 사용하는 것입니다

struct A { }; 
struct B : A { }; 
struct C : A { }; 
struct D : B, C { }; 

A * a = ...; 
D * d = ...; 

/* static casting A to D would fail, because there are multiple A's for one D */ 
/* dynamic_cast<void*>(a) magically converts your a to the D pointer, no matter 
* what of the two A it points to. 
*/ 

A이 사실상 상속 된 경우 static_cast를 D으로 보낼 수 없습니다.

+1

또 다른 확실한 방법은 'static_cast'를 사용하여 둘 모두를 공통 기본으로 변환하는 것입니다. 물론, 당신은 공통 기반을 알고 있습니다. 그렇지 않으면 : 하나의 포인터가 다른 포인터의 기본 유형이면 컴파일러는 자동으로 변환을 수행합니다. –

5

하는 간단한 Base* b = d;가 작동합니다. 그렇다면 지금 비교하는 것처럼 포인터를 비교할 수 있습니다. 당신이 임의의 클래스 계층 구조를 비교하려면