Во-первых, было упомянуто собственное расширение Borland для C ++, Dynamic Dispatch Virtual Table (DDVT), и вы можете прочитать что-нибудь об этом в файле с именем DDISPATC.ZIP . Borland Pascal имел и виртуальные , и динамические методы, и Delphi ввел еще один синтаксис "сообщения" , аналогичный динамическому, но для сообщений. На данный момент я не уверен, что Borland C ++ имел те же функции. В Pascal или Delphi не было множественного наследования, поэтому Borland C ++ DDVT может отличаться от Pascal или Delphi.
Во-вторых, в 1990-х и немного раньше проводились эксперименты с различными объектными моделями, и Borland был не самым продвинутым. Я лично считаю, что закрытие IBM SOMobjects нанесло ущерб миру, от которого мы все еще страдаем. Перед выключением SOM проводились эксперименты с компиляторами Direct-to-SOM C ++. Таким образом, вместо метода вызова C ++ используется метод SOM. Во многих отношениях он похож на C ++ vtable, за некоторыми исключениями. Во-первых, чтобы предотвратить проблему хрупкого базового класса, программы не используют смещения внутри vtable, потому что они не знают этого смещения. Это может измениться, если базовый класс вводит новые методы. Вместо этого вызывающие вызывают thunk, созданный во время выполнения, который имеет эти знания в коде сборки. И есть еще одно отличие. В C ++, когда используется множественное наследование, объект может содержать несколько VMT IIRC. В отличие от C ++, каждый объект SOM имеет только один VMT, поэтому код отправки должен отличаться от «call dword ptr [VMT + offset]».
Существует документ, относящийся к SOM, Бинарная совместимость между выпусками в SOM . Вы можете найти сравнение SOM с другими мало известными мне проектами, такими как Delta / C ++ и Sun OBI . Они решают подмножество проблем, которые решает SOM, и благодаря этому они также имеют несколько измененный код вызова.
Недавно я обнаружил фрагмент компилятора Visual Age C ++ v3.5 для Windows, достаточный для запуска и фактического прикосновения к нему. Большинство пользователей вряд ли получат OS / 2 VM просто для игры с DTS C ++, но наличие компилятора Windows - совсем другое дело. VAC v3.5 - первая и последняя версия, поддерживающая функцию Direct-to-SOM C ++. VAC v3.6.5 и v4.0 не подходят.
- Скачать VAC 3.5 fixpak 9 с IBM FTP. Этот пакет FixPak содержит много файлов, поэтому вам даже не нужен полный компилятор (у меня есть дистрибутив 3.5.7, но пакет FixPak 9 был достаточно большим, чтобы выполнить некоторые тесты).
- Распаковать на эл. г. C: \ главная \ октаграмма \ * DTS * 1028
- Запустить командную строку и выполнить там следующие команды
- Выполнить: установить SOMBASE = C: \ home \ OCTAGRAM \ DTS \ ibmcppw
- Выполнить: C: \ home \ OCTAGRAM \ DTS \ ibmcppw \ bin \ SOMENV.BAT
- Выполнить: cd C: \ home \ OCTAGRAM \ DTS \ ibmcppw \ samples \ compiler \ dts
- Выполнить: nmake clean
- Выполнить: nmake
- hhmain.exe и его dll находятся в разных каталогах, поэтому мы должны как-то найти их; Поскольку я проводил несколько экспериментов, я выполнил «set PATH =% PATH%; C: \ home \ OCTAGRAM \ DTS \ ibmcppw \ samples \ compiler \ dts \ xhmain \ dtsdll» один раз, но вы можете просто скопировать dll рядом с hhmain. ехе
- Выполнить: hhmain.exe
У меня есть вывод таким образом:
Local anInfo->x = 5
Local anInfo->_get_x() = 5
Local anInfo->y = A
Local anInfo->_get_y() = B
{An instance of class info at address 0092E318
}