#include <iostream>
using namespace std;
class A
{
public:
static void *operator new(std::size_t size) throw(std::bad_alloc)
{
cout << "A new" << endl;
return ::operator new(size);
}
static void operator delete(void *p) throw(std::bad_alloc)
{
cout << "A delete" << endl;
return ::operator delete(p);
}
static void *operator new(std::size_t size, void *ptr) throw(std::bad_alloc)
{
return ::operator new(size, ptr);
}
static void operator delete(void *p, void *ptr) throw(std::bad_alloc)
{
return ::operator delete(p, ptr);
}
static void *operator new(std::size_t size, const std::nothrow_t &nt) throw(std::bad_alloc)
{
return ::operator new(size, nt);
}
static void operator delete(void *p, const std::nothrow_t &) throw(std::bad_alloc)
{
return ::operator delete(p);
}
};
class B : public A
{
public:
using A::operator delete;
using A::operator new;
static void *operator new(std::size_t size) throw(std::bad_alloc)
{
cout << "B new" << endl;
return ::operator new(size);
}
static void operator delete(void *p) throw(std::bad_alloc)
{
cout << "B delete" << endl;
return ::operator delete(p);
}
static void *operator new(std::size_t size, ostream &os) throw(std::bad_alloc)
{
os << "B operator new" << endl;
return ::operator new(size);
}
static void operator delete(void *p, ostream &os) throw(std::bad_alloc)
{
os << "B operator delete" << endl;
return ::operator delete(p);
}
};
int main()
{
A *a = new A;
//必须在B类内使用using,否则会覆盖Base class的operator new
B *bb = new B;
B *b = new (cout) B;
//delete(cout) b;//错误,不会调用operator delete(void *p, ostream &os)
delete b; //B中重写则用B的delete(void*)否则用A的
return 0;
}
运行结果
A new
B new
B operator new
B delete