本文主要是介绍C++多态-虚析构和纯虚析构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
- 虚析构或纯虚析构就是用来解决通过父类指针释放子类对象
- 如果子类中没有堆区数据,可以不写为虚析构或纯虚析构
- 拥有纯虚析构函数的类也属于抽象类
多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用子类的析构代码
解决方式就是将析构函数改为"虚析构"或者”纯虚析构"
虚析构和纯虚析构共性:
- 可以解决父类指针释放子类对象
- 都需要有具体的函数实现
虚析构和纯虚析构区别:
如果是纯虚析构,该类属于抽象类,无法实例化对象
虚析构和纯虚析构语法
虚析构:virtual ~类名(){}
纯虚析构:
virtual~类名() = 0;
然后 类名::~类名(){
…
}
#include<iostream>
#include<string>
using namespace std;//虚析构和纯虚析构
/*多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码
* 意思就是子类中要new一个空间,使用父类
解决方式:将父类中的析构函数改为虚析构或者纯虚析构虚析构和纯虚析构共性
可以解决父类指针释放子类对象
都需要有具体的函数实现
虚析构和纯析虚构区别:
如果是纯虚析构,该类属于抽象类,无法实例化对象虚析析构语法:
virtual ~类名(){}纯虚析构语法:
virtual~类名() = 0;
然后类外写实现下面的写法
类名::类名(){}
*/
class Animal {
public:Animal() {cout << "Animal构造函数调用!" << endl;}virtual void Speak() = 0;//析构函数加上virtual关键字,变成虚构函数/*virtual ~Animal(){cout << "animal虚析构函数的调用!" << endl;}*/virtual ~Animal() = 0;
};
Animal:: ~Animal()
{cout << "Animal纯虚构函数的调用" << endl;
}class Cat :public Animal
{
public:Cat(string name){cout << "Cat构造函数调用!" << endl;m_Name = new string(name);}virtual void Speak(){cout << *m_Name << "小猫在说话" << endl;}~Cat(){cout << "Cat析构函数调用" << endl;if (this->m_Name != NULL){cout << "程序结束前释放析构函数,则当前指针为kong" << endl;delete m_Name;m_Name = NULL;}}string* m_Name;
};
void test01()
{/*Animal* animal = new Animal("Tom")*/;//纯虚函数无法实例化对象Animal*animal = new Cat("Tom");animal->Speak();delete animal;
}
int main()
{test01();return 0;
}
这篇关于C++多态-虚析构和纯虚析构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!