Re: Вопрос про novtable. dynamic_cast и деструктор
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 25.10.19 13:47
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Еще вопросы по 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. Но, полагаю, там тоже проблем не будет...
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.