已知:如果是子类指针指向子类对象,那么构造和析构顺序是:父子子父
但是:如果再多态中,是父类指针指向子类对象,那么需要注意,一定要把父类的析构函数作为虚析构。
因为由于多态,delete对象的时候会调用对象的析构函数,但是如果析构函数不是虚函数的话,那么就会默认调用父类的析构函数【这跟普通虚函数一样,如果不是virtual的,那么默认调用父类函数】
如下:
#include <iostream>
class Parent {
public:
Parent(){}
~Parent(){std::cout << "~Parent."<<std::endl ;}
virtual void process() = 0;
};
class Son : public Parent {
public:
Son(){}
~Son(){std::cout << "~Son."<<std::endl;}
virtual void process() { std::cout << "process."<<std::endl;}
};
int main(){
Parent* son = new Son;
son->process();
delete son;
}
上面程序只会调用父类析构,子类析构不会被执行,可能产生内存泄漏。
只需要改父类的析构函数为虚析构:
class Parent {
public:
Parent(){}
virtual ~Parent(){std::cout << "~Parent."<<std::endl ;}
virtual void process() = 0;
};
class Son : public Parent {
public:
Son(){}
~Son(){std::cout << "~Son."<<std::endl;}
virtual void process() { std::cout << "process."<<std::endl;}
};
int main(){
Parent* son = new Son;
son->process();
delete son;
}