Посмотрел все темы в этом разделе и не могу найти явные ответы на некоторые вопросы.
1. В КП определен общий базовый тип ANYREC и соответственно, указатель на общий базовый тип ANYPTR.
Таким образом, должен работать принцип подстановки Лисков: на место объекта базового типа может быть подставлен объект производного типа.
В сообщении о языке при описании оператора with обнаруживаем следующее описание, косвенно подтверждающее наличие принципа подстановки:
Цитата:
Åñëè v — ïàðàìåòð-ïåðåìåííàÿ òèïà çàïèñåé èëè óêàçàòåëüíàÿ ïåðåìåííàÿ, è åñëè åå ñòàòè÷åñêèé òèï T0, òî çíà÷åíèå îïåðàòîðà
WITH v: T1 DO S1 | v: T2 DO S2 ELSE S3 END
òàêîâî: åñëè äèíàìè÷åñêèì òèïîì ïåðåìåííîé v îêàçàëñÿ T1, òî âûïîëíÿåòñÿ îïåðàòîðíàÿ ïîñëåäîâàòåëüíîñòü S1, â êîòîðîé v ðàññìàòðèâàåòñÿ êàê åñëè áû åå ñòàòè÷åñêèì òèïîì áûë T1; â ïðîòèâíîì ñëó÷àå åñëè äèíàìè÷åñêèì òèïîì v îêàçàëñÿ T2, òî âûïîëíÿåòñÿ S2, â êîòîðîé v ðàññìàòðèâàåòñÿ êàê åñëè áû åå ñòàòè÷åñêèì òèïîì áûë T2; â ïðîòèâíîì ñëó÷àå âûïîëíÿåòñÿ S3. T1 è T2 äîëæíû áûòü ïîòîìêàìè òèïà T0.
О-па! Как сие исправить? Это текст из русской справки. Выставить в справке другой шрифт? У меня win 2000 сейчас.
Но суть в том, что выполняется та ветка, в которой
динамический тип переменной v совпадает с прописанным типом: t1 или t2. А если не совпадает, то выполняется ветка else.
Однако в приложении А совместимость по присваиванию определена только для указательных типов.
Явно об этом нигде не написано, но получается, что для объектов типа записей принцип подстановки не выполняется, а выполняется только для указателей на записи.
Второе. Значит ли это, что в операторе with можно задавать только указатели, а не сами объекты? Получается именно так.
Если это так, то понятно почему в КП нигде не упоминается и срезке, когда на место объета базового типа подставляется объект производного типа с новыми полями, которых нет в базовом.
Это же самое означает, что мы не можем писать процедуру с параметром-объектом базового типа, чтобы она обрабатывала объекты производного типа. Можно передавать только базовый указатель.
2. В С++ есть два способа для работы с типами во время исполнения: RTTI и виртуальность.
Как я понимаю, оператор with является неким аналогом RTTI - явные проверки динамического типа. Во всех учебниках по С++ написано, что желательно RTTI не использовать, поскольку есть виртуальные функции. Да я сам писал об этом.
По некоторым постам и текстам получается, что виртуальность в КП есть. Например, v.method() - вызывается метод по динамическому типу v, а не по статическому. Или это не так? v тогда должен быть указателем на базовый тип.