Здравствуйте, Phoenics, Вы писали:
A>>A>> A *a = dynamic_cast<A *>(ptr);
A>>
P>Компилятор VC7.0 грит error C2681: 'void *' : invalid expression type for dynamic_cast
Естественно.
Если ты уверен, что ptr — точно на A (и, возможно, на его потомков), то
A* pA = reinterpret_cast<A*>(pVoid); // первое допущение мы вынуждены сделать на свой страх и риск
AA* pAA = dynamic_cast<AA*>(pA); // в случае неудачи получим NULL
P>А можно ли просто привести тип к базовому? Типа A *a = (A*) pVoidPtr; Не будет ли перекосов при множественном наследовании или ещё в каких-нибудь ситуациях? Вызываемый метод не виртуальный. Наверное стоит сказать что метод который должен вызываться это перегруденный оператор delete, Ни у кого из классов потомков он не переопределяется.
Тогда, опять же в допущении, что это A*, просто
delete reinterpret_cast<A*>(pVoid);
Но может быть, тебе нужно косвенное удаление — подобно тому, как это делает shared_ptr, запоминающий функцию-убийцу вместе с переданным указателем?
typedef void(*deleter_func)(void*);
struct deleteable_ptr
{
void* ptr;
deleter_func del;
// всякий обвес - конструкторы, операторы и т.п. - напиши сам по вкусу
};
////////////////////////////////
deleteable_ptr p;
p.ptr = new AA();
p.del = boost::checked_delete<AA>;
/////////////////////////////////
p.del(p.ptr);
Я надеюсь, что ты знаешь разницу между стейтментом delete (совершающим вызов деструктора, затем вызов оператора) и оператором delete (просто утилизирующим память).
Поэтому del запоминает именно checked_delete, являющуюся обёрткой стейтмента
template<class T> void checked_delete(void* p) { delete reinterpret_cast<T*>(p); }
... << RSDN@Home 1.2.0 alpha rev. 655>>