2016-08-23 21 views
1

У меня есть полиморфных классов, производных от базового класса A:Ожидаемая эквивалентность: TypeId выражения данных и выражения типа

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) может быть правдой, если у вас был новый элемент A в вашем массиве.

Online demo для третьего случая, заменив один из производного объекта на объект A.

Осторожно: Типовой эквивалент, который вы проверяете, является строгого эквивалента типа. Это верно только для точных совпадений. Это означает, что для второго столбца тест завершится неудачно для объекта, полученного из B. Возможно, это то, что вы ищете и хорошо. Но это серьезно ограничило бы расширяемость вашего полиморфного дизайна, если вы намерены просто проверить, следует ли звонить mB() или mC(). В качестве альтернативы вы можете рассмотреть использование dynamic_cast<> и проверку того, возвращает ли он nullptr или нет.

+0

Спасибо, Кристоф! Это мило. – Isi

 Смежные вопросы

  • Нет связанных вопросов^_^