提供赣州网站建设,网页制作教程视频简单,合二为一的创意产品设计,哈尔滨市建设工程质量安全站虚析构和纯虚析构
虚析构virtual ~类名(){}类内声明#xff0c;类内实现解决问题#xff1a;通过父类指针指向子类对象释放时候不干净的问题
纯虚析构 写法 virtual ~类名(){}0; 类内声明 类外实现 如果出现了纯虚析构函数#xff0c;这个类也算是抽象类#xff0c;不可…虚析构和纯虚析构
虚析构virtual ~类名(){}类内声明类内实现解决问题通过父类指针指向子类对象释放时候不干净的问题
纯虚析构 写法 virtual ~类名(){}0; 类内声明 类外实现 如果出现了纯虚析构函数这个类也算是抽象类不可以实例化 #define _CRT_SECURE_NO_WARNINGS
#includeiostreamusing namespace std;class Animal
{
public:virtual void speak(){cout 动物在说话 endl;}//普通的析构 是不会调用子类的析构的所以可能会导致释放不干净//利用虚析构来解决这个问题/*virtual ~Animal(){cout 动物的析构调用 endl;}*///纯虚析构 写法如下 还需要实现 类内声明类外实现virtual ~Animal() 0;//如果函数中出现了 纯虚函数析构 那么这个类也算是抽象类//抽象类 不可实例化对象};
Animal ::~Animal()
{//纯虚析构函数实现cout 动物的纯虚析构调用 endl;
}//如果出现纯虚析构类也算抽象类不能实例化对象
//void func()
//{
// Animal aa;
// Animal *animal new Animal;
//}class Cat : public Animal
{
public:Cat(const char *name){this-m_Name new char[strlen(name) 1];strcpy(this-m_Name, name);}virtual void speak(){cout 小猫在说话 endl;}~Cat(){cout Cat的析构调用 endl;if (this-m_Name ! NULL){delete[]this-m_Name;this-m_Name NULL;}}char * m_Name;
};//
void test01()
{Animal *aniaml new Cat(TOM);aniaml-speak();delete aniaml;
}int main()
{test01();system(pause);return 0;
}向上类型转化和向下类型转化
派生类的大小一般都要大于基类
基类转派生类向下类型转化 不安全派生类转基类向上类型转化 安全如果发生多态总是安全的