再谈new的内存的释放实例-类的多态

来源:互联网 发布:淘宝海外直购 编辑:程序博客网 时间:2024/05/20 09:11

面向对象编程都知道多态的概念。我来谈多态中new的内存问题。

class  Base

{

       public:

Base(){

cout << "Base::Base()" << endl;

};

~Base(){//注释1

cout << "Base::~Base()" << endl;

};

virtual void DoSomthing()

{

cout << "Do something in class Base!"<< endl;

};

};


class Derived:public Base

{

public:

Derived(){

cout << "Derived::Derived()" << endl;

};

~Derived(){

cout << "Derived::~Derived()" << endl;

};

virtual void DoSomthing()

{

cout << "Do something in class Derived!"<< endl;

};

};


int main()

{

Derived *ptest1 = new Derived();//Derived类的指针  //注释2

ptest1->DoSomthing();

delete ptest1;


Base*ptest2 = new Derived();//Base类的指针 //注释3

ptest2->DoSomthing();

delete ptest2;

return 0;

}


从上述代码中的注释3处,可以很清楚的看出,虽然new的是子类Derived的对象

但是把地址赋给父类,释放的是父类的指针。

总结new 分配内存,delete 释放内存.注意,使用delete的关键在于,将它用于new
分配的内存.这并不意味着要使用用于new的指针,而是用于new的地址
第二个问题:注释2处,可以正常释放内存,构造函数的顺序是父类->子类,而析构函数的调用顺序是
子类->父类,

注释3处,多态的调用,只析构了父类,而造成子类未被释放。所以需要在注释1处加上关键字

virtual,虚函数是动态绑定的,virtual关键字的作用是确定new对象是子类的还是父类的

原创粉丝点击