继承和多态二:虚析构函数
虽然我们已经知道了什么是继承和多态,也明白了多态依赖于继承,但是在多态中存在哪些问题呢?
多态中可能存在的内存泄露问题
例如下面的程序中,在圆形Circle的类中定义一个圆心的坐标,并且坐标是在堆中申请的内存,则在mian函数中通过基类指针操作派生类对象的成员函数是没有问题的,可是在销毁对象内存的时候则只是执行了基类的析构函数,派生类的析构函数却没有执行,这会导致内存泄漏。换句话说如果delete后边跟基类的指针则只会执行基类的析构函数,如果delete后面跟的是派生类的指针,那么它即会执行派生类的析构函数,也会执行基类的析构函数
class Shape { public: virtual double calcArea(){...}//虚函数 Shape(); ~Shape(); .... private: .... }; Shape::Shape() { cout<<"class Shape was created"<<endl; } Shape::~Shape() { cout<<"class Shape was deleted"<<endl; } class Circle:public Shape { public: Circle(int x,int y,double r); ~Circle(); virtual double calcArea();//此处可不加virtual,但系统默认加上 .... private: double m_dR; Coordinate *m_pCenter; //坐标类指针 .... }; Circle::Circle(int x,int y,double r) { m_pCenter=new Coordinate(x,y); m_dR=r; cout<<"class Circle was created"<<endl; } Circle::~Circle() { delete m_pCenter; m_pCenter=NULL; cout<<"class Circle was deleted"<<endl; } .... int main() { Shape *shape1=new Circle(5,6,4.0);//基类对象,改成Circle *circle=new Circle(5,6,4.0)则为派生类对象 shape1->calcArea(); delete shape1; shape1=NULL;//派生类对象的内存未回收 return 0; }
我们都在通往真理的路上。