45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:需要虚析构函数的时间

需要虚析构函数的时间

2016-09-06 12:57:22 来源:www.45fan.com 【

需要虚析构函数的时间

答案:当你的类准备给别人继承时要提供虚析构函数
??考虑下面例子:
??class A
??{
??public:
?? A(){cout << "In A constructor" << endl;}
?? ~A(){cout << "In A destructor" << endl;}
??};
??
??class B : public A
??{
??public:
?? B()
?? {
?? cout << "In B constructor" << endl;
?? m_p = new char[10];
?? }
?? ~B()
?? {
?? cout << "In B destructor" << endl;
?? if (m_p) delete [] m_p;
?? }
??private:
?? char *m_p;
??};
??
??int main(int argc, char* argv[])
??{
?? //printf("Hello World!/n");
?? A *p = new B;
?? delete p;
??
?? return 0;
??}
??输出结果:
??In A constructor
??In B constructor
??In A destructor
??
??并没有调用B的析构函数,new出来的内存没有及时回收造成内存泄漏。
??要解决这个问题,只要将A的析构函数定义为虚函数:~A(){cout << "In A destructor" << endl;}。为什么定义为虚函数就能解决呢?我是这样理解的:
??象其它虚构函数一样,~B()重定义(overridden)了~A(),这样指向派生类的指针就能根据运行时的状态调用B的析构函数了。这里又有一个问题:为什么还会调用A的析构函数呢?我只能理解为析构函数是一个特殊的函数,由系统维护其机制。就像B.~A()是错误而B.~B()(虽然逻辑上不对,但语法上是正确的,编译运行完全没问题)是正确的一样。
??
??Any idea for this?
 

本文地址:http://www.45fan.com/a/question/73204.html
Tags: 你的 函数 答案
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部