2010-07-28 11 views
3

하나는 서브 클래스를 비교하는연산자 ==

operator==(const Base& base) 

구현하는 방법을 s.t. 무료 서 함수로 연산자 ==를 구현

Base* base1 = new Derived1(); 
Base* base2 = new Derived2(); 
base1->operator==(*base2)? 
+6

'operator =='는 독립 실행 형 함수로 구현되어야하며, 그렇지 않은 경우에는 인수에 대칭이 아닙니다. – Philipp

+3

더 효과적인 C++에서 이중 디스패치에 대한 좋은 토론이 있습니다. –

+0

'Derived1'은'Derived2'와 동일 할 수 있습니까? 자세한 정보를 입력하십시오. – curiousguy

답변

6
  1. 로 호출 할 때 호출이 제대로 전달 될 것이다.
  2. 는 인수 중 하나에 (예를 들어, ISEQUAL을()) 가상 메소드를 호출 가지고 당신이

    Derived1::IsEqual(const Base& base) 
    

    을 호출이 점에 당신을 얻을 수

. 당신은 몇 가지 옵션이 여기에서

  1. 사용 RTTI는 가상으로

    virtual bool Base::IsEqualToDerived(const Derived1& d) {return false}; 
    virtual bool Base::IsEqualToDerived(const Derived2& d) {return false}; 
    

을 구현할 수, 유도의 수가 작고 유한 한 경우 기본이

  • 을 Derived1하기> <를 dynamic_cast는합니다 행동 양식. Derived1에서는 실제를 재정의하고 비교합니다.

  • 1

    이것은 연산자 ==에 대한 특정 질문보다는 클래스 및 유형에 대한 일반적인 C++ 질문처럼 보입니다. 내 지식에 따라 특정 예제에서 다른 방법은 없지만 사용할 수 있습니다. dynamic_cast

    +2

    가상 함수를 사용하여 dynamic_cast없이 수행 할 수 있습니다. –

    +0

    그럼 base1이 적절한 호출을 받거나 입력 인자가 Base가 아닌 Derived2라는 것을 알 수있는 문제가 무엇입니까? 첫 번째는 가상 함수 (나는 동의 함)를 사용하여 해결되며, 두 번째는 dynamic_cast – rodrigob