最近复习C++基础知识,在类继承里面需要注意基类析构函数最好将定义为虚析构。
一、不定义虚析构的情况。
#include <iostream>
using namespace std;
class Base
{
public:
Base()
{
cout << "Base()" << endl;
};
~Base()
{
cout << "~Base()" << endl;
}
};
class Derived :public Base
{
public:
Derived()
{
cout << "Derived()" << endl;
}
~Derived()
{
cout << "~Derived()" << endl;
}
};
int main()
{
Base* pBase = new Derived;
delete pBase;
cin.get();
return 0;
}
运行:
发现析构为调用子类析构,可能会造成内存泄漏。
二、定义基类虚析构。
#include <iostream>
using namespace std;
class Base
{
public:
Base()
{
cout << "Base()" << endl;
};
virtual ~Base()
{
cout << "~Base()" << endl;
}
};
class Derived :public Base
{
public:
Derived()
{
cout << "Derived()" << endl;
}
~Derived()
{
cout << "~Derived()" << endl;
}
};
int main()
{
Base* pBase = new Derived;
delete pBase;
cin.get();
return 0;
}
运行:
这样,才应是正确的。
三、分析总结。
分析:
如果将析构函数前的virtual去掉,delete pBase的时候调用的只有Base类的析构函数。
加上virtual,先析构Derived,再析构Base。
总结:
构造顺序:Base->Derived
析构顺序:Deriver->Base(Base 虚析构)
Base(Base 非虚析构)
今天的文章基类析构函数最好将定义为虚析构分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/9390.html