2009-07-07 5 views
0

는 :: C++ .NET에서 같음하지만 어려움두 객체가 같은 기본 클래스에서 상속하는지 확인하는 방법은 무엇입니까? 내가 객체를 대체하기 위해 노력하고있어

virtual bool IState::Equals(Object^ o) override{ 
     if (o->GetType() == IState::typeid){ 
      IState^ s = (IState^) o; 
      if (s->type == this->type && 
       s->target_state == this->target_state && 
       s->current_state == this->current_state){ 
       return true; 
      } 
      else{ 
       return false; 
      } 
     } 
     return false; 
    } 

O이고 IState 경우이 코드는 잘 작동 실행 해요. 그러나 나는 IState로부터 State를 상속 받았다. 똑같은 내용의 State를 전달하면 My Equals 함수가 true를 반환하도록하고 싶습니다.

나는 State가 IState와 같지 않지만 같은 기본 클래스에서 상속하는지 확인하는 연산자가 있습니까? operator typeid를 오버로드하면 이 될 수 있지만 많은 문제가있는 것 같습니다.

+3

가치가 있다면, 이름 앞에 접두어가 붙은 클래스 (인터페이스임을 나타냄)를 사용하면 .NET 지침을 위반하게됩니다. –

+0

은 C++/CLI와 C++이 매우 다른 짐승이기 때문에 태그를 변경했습니다. :) – jalf

+0

왜 인터페이스에서 어떤 것을 재정의하고 있습니까? 인터페이스에는 구현이 없어야합니다. – CodeFusionMobile

답변

0

typeid 연산자를 사용하는 것은 어떻습니까? http://msdn.microsoft.com/en-us/library/fyf39xec(VS.80).aspx

+0

이것은 기본적으로 내가하는 일입니다. typeid()를 사용하면 컴파일러에서 :: typeid 구문에 오류 c3185를 사용하도록 알려줍니다. http://msdn.microsoft.com/en-us/library/sf08zfcc.aspx – Eric

1

가 좋아 나는 내가 없어진

일하러 가야 관리하는 -> baseType 여기서()는 후 -> GetType을 (를)

virtual bool IState::Equals(Object^ o) override{ 
     if (o->GetType()->BaseType() == IState::typeid){ 
       IState^ s = (IState^) o; 
       if (s->type == this->type && 
         s->target_state == this->target_state && 
         s->current_state == this->current_state){ 
         return true; 
       } 
       else{ 
         return false; 
       } 
     } 
     return false; 
    } 

은 감사 작업 버전 모든 시간, 지원 및 헌신 =)

+0

하나 이상의 상속 레벨; 즉 IState <- Foo <- Bar를 사용하고 Bar의 인스턴스를 IState :: Equals()에 전달합니다. –

3

올바른 방법은 dynamic_cast를 사용하고 nullptr :

을 확인하는 것입니다.210
virtual bool IState::Equals(Object^ o) override { 
    IState^ s = dynamic_cast<IState^>(o); 
    if (s != nullptr) { 
     ... 
    } 
    return false; 
} 

C 스타일의 캐스트 (실제로 BTW 사용 안 함)는 safe_cast를 실제로 수행하여 실패시 InvalidCastException을 throw하므로 명시 적으로 dynamic_cast를 사용해야합니다.

관련 문제