Listing 2: Code to illustrate overload resolution for allocation functions

void *operator new(size_t) throw (bad_alloc);

class B
    {
public:
    void *operator new(size_t, void *) throw (bad_alloc);
    void *operator new(size_t, char *) throw (bad_alloc);
    ...
    };

class D : public B
    {
    ...
    };

void f()
    {
    ...
    D *pd = new D;      // error - no match in B
    ...
    pd = new (pd) D;    // calls
                        // B::operator new(size_t, void *)
    ...
    pd = new (0) D;     // error - ambiguous
    ...
    }
/* End of File */