当类中定义了自定义的new操作符时,编译器会调用这个操作符来分配类的实例所需的内存。当派生类也定义了自己的new操作符时,派生类对象在实例化时会调用派生类的new操作符。这里是一个示例:
#include
#include
using namespace std;
class Base {
public:
void *operator new(size_t size) {
cout << "Calling Base::new " << endl;
void *p = malloc(size);
return p;
}
void operator delete(void *p) {
cout << "Calling Base::delete " << endl;
free(p);
}
};
class Derived: public Base {
public:
void *operator new(size_t size) {
cout << "Calling Derived::new " << endl;
void *p = malloc(size);
return p;
}
void operator delete(void *p) {
cout << "Calling Derived::delete " << endl;
free(p);
}
};
int main() {
Base *b = new Base();
Derived *d = new Derived();
delete b;
delete d;
return 0;
}
输出结果如下:
Calling Base::new
Calling Derived::new
Calling Base::delete
Calling Derived::delete
可以看到,派生类中的new操作符覆盖了基类中的new操作符,因此在创建Derived对象时,会调用Derived的new操作符。但在删除对象时,仍然会调用基类的delete操作符,因为Derived没有覆盖基类的delete操作符。
上一篇:编译器如何知道C数组的大小?