面向对象编程都知道多态的概念。我来谈多态中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对象是子类的还是父类的