break;

В данном примере используется функция isA(), возвращающая числовое значение, которое может быть проверено в операторе switch. Предполагается, что каждому классу присваивается уникальный идентификатор класса, соответствующий константе OBJ_* или элементу перечисления.

К сожалению, такая реализация функции isA() может породить несколько проблем. Проверка возвращаемого значения подразумевает согласованность всех классов таким образом, что совпадение их идентификаторов полностью исключается. Использование числовых констант в качестве идентификаторов класса легко реализовать в случае небольших библиотек классов, для которых разработчик имеет все исходные тексты. Отсутствие исходного кода исключает, по меньшей мере, использование перечислений для хранения идентификаторов констант.

Числовые константы могут оказаться удобными, но они быстро превращаются в настоящий кошмар на стадии поддержки и развития программного обеспечения. По этой причине программисты определяют для своих классов метод isA() так, чтобы он возвращал символьную строку, содержащую имя класса. Фрагмент кода, определяющий, является ли Genericobject представителем класса Apple, может выглядеть, например, так:

// Ссылается ли этот указатель на Apple? if (!strcomp(pObject->isA(), "Apple")) {

// Да — выполняются действия для Apple ) else{

//Нет! — выполняются другие действия

Такой вариант чуть более сложен, чем просто возврат константы, но он обеспечивает уже некоторую гибкость. Вероятность того, что два независимых разработчика определят для своих классов одинаковые строки, возвращаемые функцией isA (), достаточно мала.

Тем не менее и при таком подходе проблемы все еще остаются. Что, если разработчик не позаботится определить для своего класса метод isA о? Реализация объекта нового класса в этом случае возвратит значение isA о, соответствующее своему родителю, что будет, конечно, неверно. Даже если программист определит метод, все-таки остается вероятность (хотя и очень маленькая) того, что значение, возвращаемое функцией isA(), уже кем-то используется (будем рассматривать крайний случай). Наконец, что случится, если необходимо интегрировать данную библиотеку с другой, в которой аналогичный метод называется ISA о или GetTypeiDO? Или, в еще более