基类析构函数最好将定义为虚析构

基类析构函数最好将定义为虚析构最近复习C++基础知识,在类继承里面需要注意基类析构函数最好将定义为虚析构。一、不定义虚析构的情况。#include<iostream>usingnamespacestd;classBase{public: Base() { cout<<“Base()”<<endl; }; ~Base() { cout<…

最近复习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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注