Но это не отменяет содержания виртуальной таблицы в нём, включая виртуальный деструктор.
Да, с этим согласен. Но имея наследника, всегда можно вызвать актуальный деструктор из виртуальной таблицы. А там автоматически будет или виртуальный деструктор базового класса, или виртуальный деструктор наследника. Что там будет, то и вызовем.
Как это не имеет? Вы имеете право скастовать наследника к предку и удалить его через этот указатель
Скастовать не получится. Точнее в этом нет необходимости. Язык разработки Object Pascal (Delphi 11). Надо вызывать тот деструктор, который специфичен для данного класса или, как указано выше, если деструктор виртуальный - тот деструктор, который в виртуальной таблице.
Это конструктор с default-параметрами, которые вполне могут быть NonTrivial. Соответственно, для...
Согласен, но так как я точно знаю перечень конструкторов (и их параметров) и деструкторов - в рамках одной и той же версии DLL мне самому надо разбираться, что вызвать, чтобы создать и уничтожить экземпляр класса.
Это OpenCV версии 4.6.0. Взяты готовые dll с сайта opencv.org. Чем они собирали? Сложно сказать какой версии CMake и MS Visual Studio. Последний скорее всего не ниже 2019.
Платформа Windows x64.
Импорт в среде Delphi 11. Репозитарий Delphi-OpenCV-Class Статья Delphi+OpenCV
Огромное спасибо за развернутый ответ, а особенно за ссылки на документацию, из которой много, что прояснилось.
vbase destructor, как намекает само название, означает виртуальный деструктор базового класса. В моем случае этот базовый класс не используется напрямую и что-то полезное получается в его наследниках, которые и используются на практике. Базовый класс в этом смысле используется как перечень обязательных методов в наследниках. Кроме этого, его можно использовать для создания своих потомков это и объясняет появление в экспорте виртуального деструктора базового класса. При использовании в проекте наследников от базового класса импорт vbase destructor не имеет смысла.
Здесь же замечание.
Традиционный экспорт деструктора дается в виде, например, cv::AKAZE::~AKAZE(void)
а виртуальный деструктор базового класса экспортируется как void cv::BRISK::`vbase destructor'(void)
поэтому и возник вопрос об отличии в описании деструктора.
Для default constructor closure ситуация оказалась проще. Это конструктор без параметров в классе, в котором не описан конструктор без параметров. Компилятор его создает автоматически. Например, для
этот конструктор вызывается при объявлении переменной cv::detail::BlocksChannelsCompensator somevar;
Ну и просто комментарий.
Я уже использовал OpenCV C API из версии 2.4.13. Надо двигаться дальше. Тем более в версии OpenCV 4.6.0 ничего уже и не осталось от C API.
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.
Да, с этим согласен. Но имея наследника, всегда можно вызвать актуальный деструктор из виртуальной таблицы. А там автоматически будет или виртуальный деструктор базового класса, или виртуальный деструктор наследника. Что там будет, то и вызовем.
Скастовать не получится. Точнее в этом нет необходимости. Язык разработки Object Pascal (Delphi 11). Надо вызывать тот деструктор, который специфичен для данного класса или, как указано выше, если деструктор виртуальный - тот деструктор, который в виртуальной таблице.
Согласен, но так как я точно знаю перечень конструкторов (и их параметров) и деструкторов - в рамках одной и той же версии DLL мне самому надо разбираться, что вызвать, чтобы создать и уничтожить экземпляр класса.