Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Еще вопросы по novtable. Возможны ли засады:
КД>2. С виртуальными деструкторами novtable-классов?
КД>3. С dynamic_cast-ом?
| Я тут небольшой тестовый пример накатал. |
| ////////////////////////////////////////////////////////////////////////////////
#include <iostream>
////////////////////////////////////////////////////////////////////////////////
//class t_object
class __declspec(novtable) t_object
{
public:
virtual ~t_object()
{
std::cout<<"~t_object"<<std::endl;
}
virtual int get_id()const=0;
};//class t_exec_base
////////////////////////////////////////////////////////////////////////////////
//class t_exec_base
class __declspec(novtable) t_exec_base:public t_object
{
public:
virtual void exec()=0;
};//class t_exec_base
////////////////////////////////////////////////////////////////////////////////
//class t_exec
class t_exec:public t_exec_base
{
public:
virtual ~t_exec()
{
std::cout<<"~t_exec"<<std::endl;
}
virtual int get_id()const override
{
return 1;
}
virtual void exec()override
{
std::cout<<"EXEC"<<std::endl;
}
};//class t_exec
////////////////////////////////////////////////////////////////////////////////
int main()
{
{
t_exec x;
t_object* const obj=&x;
t_exec_base* const p=dynamic_cast<t_exec_base*>(obj);
p->exec();
}
{
std::cout<<"------------------"<<std::endl;
t_object* p=new t_exec();
delete p;
}
return 0;
}//main
////////////////////////////////////////////////////////////////////////////////
|
| |
Проблем с dynamic_cast и виртуальным деструктором не наблюдается (VS2019):
Вывод:
EXEC
~t_exec
~t_object
------------------
~t_exec
~t_object
Надо бы еще накатать тест, в котором t_object и t_exec_base экспортируются из DLL. Но, полагаю, там тоже проблем не будет...
-- Пользователи не приняли программу. Всех пришлось уничтожить. --