虽然我们已经知道了什么是继承和多态,也明白了多态依赖于继承,但是在多态中存在哪些问题呢?
多态中可能存在的内存泄露问题
例如下面的程序中,在圆形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; }