• Что за типы функций при импорте OpenCV DLL в Delphi?

    @Laax Автор вопроса
    Дмитрий,
    Но это не отменяет содержания виртуальной таблицы в нём, включая виртуальный деструктор.

    Да, с этим согласен. Но имея наследника, всегда можно вызвать актуальный деструктор из виртуальной таблицы. А там автоматически будет или виртуальный деструктор базового класса, или виртуальный деструктор наследника. Что там будет, то и вызовем.
    Как это не имеет? Вы имеете право скастовать наследника к предку и удалить его через этот указатель

    Скастовать не получится. Точнее в этом нет необходимости. Язык разработки Object Pascal (Delphi 11). Надо вызывать тот деструктор, который специфичен для данного класса или, как указано выше, если деструктор виртуальный - тот деструктор, который в виртуальной таблице.
    Это конструктор с default-параметрами, которые вполне могут быть NonTrivial. Соответственно, для...

    Согласен, но так как я точно знаю перечень конструкторов (и их параметров) и деструкторов - в рамках одной и той же версии DLL мне самому надо разбираться, что вызвать, чтобы создать и уничтожить экземпляр класса.
  • Что за типы функций при импорте OpenCV DLL в Delphi?

    @Laax Автор вопроса
    Это OpenCV версии 4.6.0. Взяты готовые dll с сайта opencv.org. Чем они собирали? Сложно сказать какой версии CMake и MS Visual Studio. Последний скорее всего не ниже 2019.
    Платформа Windows x64.
    Импорт в среде Delphi 11.
    Репозитарий Delphi-OpenCV-Class
    Статья Delphi+OpenCV
  • Что за типы функций при импорте OpenCV DLL в Delphi?

    @Laax Автор вопроса
    Огромное спасибо за развернутый ответ, а особенно за ссылки на документацию, из которой много, что прояснилось.
    vbase destructor, как намекает само название, означает виртуальный деструктор базового класса. В моем случае этот базовый класс не используется напрямую и что-то полезное получается в его наследниках, которые и используются на практике. Базовый класс в этом смысле используется как перечень обязательных методов в наследниках. Кроме этого, его можно использовать для создания своих потомков это и объясняет появление в экспорте виртуального деструктора базового класса. При использовании в проекте наследников от базового класса импорт vbase destructor не имеет смысла.
    Здесь же замечание.
    Традиционный экспорт деструктора дается в виде, например,
    cv::AKAZE::~AKAZE(void)
    а виртуальный деструктор базового класса экспортируется как
    void cv::BRISK::`vbase destructor'(void)
    поэтому и возник вопрос об отличии в описании деструктора.

    Для default constructor closure ситуация оказалась проще. Это конструктор без параметров в классе, в котором не описан конструктор без параметров. Компилятор его создает автоматически. Например, для
    void cv::detail::BlocksChannelsCompensator::`default constructor closure'(void)

    этот конструктор вызывается при объявлении переменной
    cv::detail::BlocksChannelsCompensator somevar;
    Ну и просто комментарий.
    Я уже использовал OpenCV C API из версии 2.4.13. Надо двигаться дальше. Тем более в версии OpenCV 4.6.0 ничего уже и не осталось от C API.