【发布时间】:2011-06-22 05:55:36
【问题描述】:
我遇到了这个:
struct Base {
void* operator new (size_t);
void operator delete (void*);
virtual ~Base () {} // <--- polymorphic
};
struct Derived : Base {};
void Base::operator delete (void *p)
{
Base *pB = static_cast<Base*>(p);
if(dynamic_cast<Derived*>(pB) != 0)
{ /* ... NOT reaching here ? ... */ }
free(p);
}
如果我们这样做,
Base *p = new Derived;
delete p;
令人惊讶的是,condition inside the Base::delete is not satisfied
我做错什么了吗?或者从void* 转换会丢失Derived* 的信息?
【问题讨论】:
-
我不认为
dynamic_cast一开始就在void*上工作。 -
如果要覆盖Derived对象的delete行为,只需为Derived定义一个delete操作符即可。由于您有一个虚拟析构函数,因此始终会调用正确的删除运算符。
标签: c++ operator-overloading dynamic-cast