#include <iostream>
class base {
friend class deleter;
protected:
static void operator delete(void *p);
};
class derived : public base {
};
class deleter {
public:
void del(base *p) {
delete p;
}
};
auto main()->int {
derived *derivedp = new derived();
//delete derivedp; // this must not be allowed
deleter thisdeleter;
thisdeleter.del(derivedp); // this should succeed
return EXIT_SUCCESS;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgYmFzZSB7CiAgZnJpZW5kIGNsYXNzIGRlbGV0ZXI7CnByb3RlY3RlZDoKICBzdGF0aWMgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqcCk7Cn07CgpjbGFzcyBkZXJpdmVkIDogcHVibGljIGJhc2Ugewp9OwoKY2xhc3MgZGVsZXRlciB7CnB1YmxpYzoKICB2b2lkIGRlbChiYXNlICpwKSB7CiAgCWRlbGV0ZSBwOwogIH0KfTsKCmF1dG8gbWFpbigpLT5pbnQgewogIGRlcml2ZWQgKmRlcml2ZWRwID0gbmV3IGRlcml2ZWQoKTsKICAKICAvL2RlbGV0ZSBkZXJpdmVkcDsJCQkvLyB0aGlzIG11c3Qgbm90IGJlIGFsbG93ZWQKICAKICBkZWxldGVyIHRoaXNkZWxldGVyOwogIHRoaXNkZWxldGVyLmRlbChkZXJpdmVkcCk7CS8vIHRoaXMgc2hvdWxkIHN1Y2NlZWQKICAKICByZXR1cm4gRVhJVF9TVUNDRVNTOwp9