2016-08-23 10 views
1

I 기본 클래스 A로부터 파생 된 다형성 클래스있다 : I는 객체를 가리키는 배열을 반복 및 타입 동등한 확인 이제 원하는예상 당량 데이터 표현 형식 표현 유형 ID

class A { 
public: 
    virtual void fV() { } 
}; 

class B : public A { 
public: 
    void mB() { } 
}; 

class C : public A { 
public: 
    void mC() { } 
}; 

을 :

A *array[4] = { new B, new C, new C, new B }; 
for(int i = 0; i < 4; ++i) { 
    cout << i + 1 << ". " ; 
    (typeid(array[i]) == typeid(A)) ? cout << 1 << ' ': cout << 0 << ' '; 
    (typeid(*array[i]) == typeid(B)) ? cout << 1 << ' ': cout << 0 << ' '; 
    (typeid(*array[i]) == typeid(C)) ? cout << 1 << ' ': cout << 0 << ' '; 
    cout << endl; 
} 

결과는 다음과 같습니다

1. 0 1 0 
2. 0 0 1 
3. 0 0 1 
4. 0 1 0 

은 내가 처음에 형의 등가 기대 조건,하지만 결과로 나는 실패한 비교 (첫 번째 열에 0 0 0 0) 얻을. 두 번째 및 세 번째 조건의 결과는 예상대로입니다.

첫 번째 조건에는 어떤 문제가 있습니까?

답변

0

배열은 A* array[4]으로 정의됩니다. 따라서 array[i] 유형은 A*입니다. 에 대한 결과에서

의 두 번째 열 (인덱스 이후 첫 번째 열) :

  • typeid(array[i]) == typeid(A)는 항상 (두 번째 열에서 즉, 0)
  • typeid(array[i]) == typeid(A*)
  • 은 항상 두 번째의 예 1 (참 것이다 거짓 것 열)
  • typeid(*array[i]) == typeid(A)은 배열에 새 항목이 있으면 참일 수 있습니다.

Online demo 세 번째 경우에는 파생 된 개체 중 하나를 A 개체로 바꿉니다.

주의 :이 엄격한 타입 등가입니다 확인 유형 등가. 정확히 일치하는 경우에만 해당됩니다. 이것은 두 번째 열의 경우 B에서 파생 된 객체에 대한 테스트가 실패한다는 것을 의미합니다. 아마도 이것이 찾고 찾고있는 것일 수 있습니다. 그러나 이는 mB() 또는 mC()을 호출할지 여부를 확인하려는 경우 다형성 디자인의 확장 성을 심각하게 제한합니다. 또는 dynamic_cast<>을 사용하여 nullptr을 반환하는지 여부를 확인하십시오.

+0

감사합니다. Christophe! 그거 좋네. – Isi