四种情况:
1. 创建一个类指针时,调用其构造函数;删除当前指针时,自动调用其析构函数。
2. 创建子类对象指针时,首先调用其父类的构造函数,然后调用子类的构造函数;删除当前指针时先调用子类的析构函数,然后调用父类的析构函数。
3. 一个父类指针指向子类地址时,创建指针时先调用父类的构造函数,然后调用子类的构造函数;删除当前指针时,只调用父类的析构函数。
4. 在第三种情况中,为了在删除指针时,也调用子类的析构函数,则需要将父类的析构函数声明为抽象的。
给出具体的代码实践结果:
1 #include <iostream> 2 using namespace std; 3 4 //四种情况: 5 //1. 创建一个类指针时,调用其构造函数;删除当前指针时,自动调用其析构函数 6 //2. 创建子类对象指针时,首先调用其父类的构造函数,然后调用子类的构造函数;删除当前 7 // 指针时,先调用子类的析构函数,然后调用父类的析构函数 8 //3. 一个父类指针指向子类地址时,创建指针时先调用父类的构造函数,然后调用子类的构造函数; 9 // 删除当前指针时,只调用父类的析构函数 10 //4. 在第三种情况中,为了在删除指针时,也调用子类的析构函数,则需要将父类的析构函数声明为 11 // 抽象的 12 13 #define SAFE_DELETE(p) {delete (p);(p) = NULL;} 14 15 class Person 16 { 17 public: 18 Person(){ 19 cout<<"Person 构造函数"<<endl; 20 } 21 virtual ~Person(){ 22 cout<<"Person 析构函数"<<endl; 23 } 24 25 }; 26 27 class Son : public Person 28 { 29 public: 30 Son(){ 31 cout<<"Son 构造函数"<<endl; 32 } 33 ~Son(){ 34 cout<<"Son 析构函数"<<endl; 35 } 36 37 }; 38 39 int main(int argc, char const *argv[]) 40 { 41 Person *mPerson = new Person(); 42 SAFE_DELETE(mPerson); 43 44 45 cout<<endl<<endl; 46 47 Son *mSon = new Son(); 48 SAFE_DELETE(mSon); 49 50 cout<<endl<<endl; 51 52 Person *mPerson2 = new Son(); 53 SAFE_DELETE(mPerson2); 54 55 56 return 0; 57 }
结果:
Person 构造函数
Person 析构函数
Person 构造函数
Son 构造函数
Son 析构函数
Person 析构函数
Person 构造函数
Son 构造函数
Son 析构函数
Person 析构函数