您的位置:首页 > 编程语言 > C语言/C++

[C++基础]023_为什么要将基类的析构函数声明为Virtual?

2013-03-19 14:38 204 查看

[C++基础]023_为什么要将基类的析构函数声明为Virtual?



#include <iostream>
using namespace std;

class Father{

public:
~Father(){
cout<<"Father's Desconstruct Called."<<endl;
}
};

class Son : public Father{
public:
~Son(){
cout<<"Son's Desconstruct Called."<<endl;
}
};

int main(){

Father *f = new Son();
     delete f;

system("pause");

return 0;
}




上面的代码,用父类指针指向new出来来的之类对象,这样是没问题的,接着,对这个父类指针变量进行了delete操作。上面的输出结果是什么呢?

Father's Desconstruct Called.


可见,子类的析构函数没有被调用,那如果子类中new了内存,那么那块内存就丢了。如何保证在删除父类指针的时候,子类的析构函数也被调用呢?看如下代码:



#include <iostream>
using namespace std;

class Father{

public:
virtual ~Father(){
cout<<"Father's Desconstruct Called."<<endl;
}
};

class Son : public Father{
public:
~Son(){
cout<<"Son's Desconstruct Called."<<endl;
}
};

int main(){

Father *f = new Son();
delete f;

system("pause");

return 0;
}




输出是什么呢?

Son's Desconstruct Called.
Father's Desconstruct Called.


这就是动态联编的析构函数,至于为什么这样就可以调用子类的析构函数了,这就牵涉到另一个概念:虚函数表。具体请参照:/article/2052881.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: