#ifndef __FRUIT_H__
#define __FRUIT_H__
#include <iostream>
#include <malloc.h>
using namespace std;
class Fruit {
int no;
double weight;
char key;
public:
Fruit() { cout << "default Fruit ctor.this = " << this << endl; }
virtual ~Fruit() { cout << "Fruit dtor.this = " << this << endl; }
virtual void process() { }
void print() { }
};
class Apple: public Fruit {
int size;
char type;
public:
Apple() { cout << "default Apple ctor.this = " << this << endl; }
virtual ~Apple() { cout << "Apple dtor.this = " << this << endl; }
virtual void process() { }
void save() { }
static void* operator new(size_t size);
static void operator delete(void* ptr, size_t size);
};
inline
void* Apple::operator new(size_t size) {
if (Apple* ptr = (Apple*)malloc(size)) {
cout << "Apple::new(), size = " << size << ", return: " << ptr << endl;
return ptr;
} else {
throw bad_alloc();
}
}
inline
void Apple::operator delete(void* ptr, size_t size) {
cout << "Apple::delete(), ptr = " << ptr << ", size = " << size << endl;
free(ptr);
}
#endif //fruit.h
#include "fruit.h"
#include <iostream>
using namespace std;
int main() {
Fruit f;cout<<endl;
cout<<"-----------------------------00"<<endl;
Apple d;cout<<endl;
cout<<"-----------------------------01"<<endl;
{
Fruit *p = new Fruit();
delete p;
}cout<<endl;
cout<<"-----------------------------02"<<endl;
{
Fruit *p = new Apple();
delete p;
}cout<<endl;
cout<<"-----------------------------03"<<endl;
{
Fruit **p = new Fruit*[2];
for(int i=0; i<2; ++i){
p[i] = new Apple();
}cout<<endl;
cout<<"-----------------------------0301"<<endl;
for(int i=0; i<2; ++i){
delete p[i];
}cout<<endl;
cout<<"-----------------------------0302";
delete p;
}cout<<endl;
return 0;
}
子类创建的时候,先默认构造父类,在构造子类:
当用父类作指针,创建子类时,出现
New的时候直接New子类,指针作父类,它们的地址都是一样的。
析构时先析构子类,再析构父类。
这是数组指针,同样也是先构造子类:
释放数组堆空间:
顺道释放栈空间(栈heap会自动释放,栈stack要动手释放):