#include <iostream>
#include <string.h>
using namespace std;
//虚析构与纯虚析构
class Animal
{
public:
virtual void speak()
{
cout << "动物在说话" << endl;
}
~Animal()
{
cout << "Animal的析构调用" << endl;
}
};
class Cat :public Animal
{
public:
Cat(const char* name)
{
this->m_Name = new char[strlen(name) + 1];
strcpy_s(this->m_Name, strlen(name) + 1, name);
}
void speak()
{
cout << "小猫也在说话" << endl;
}
~Cat()
{
if (this->m_Name != NULL) {
delete[] this->m_Name;
this->m_Name = NULL;
}
cout << "小猫的析构函数" << endl;
}
char * m_Name;
};
void test01()
{
Animal *cat1 = new Cat("Tom");
cat1->speak();
delete cat1;
//此时调用的是Animal的析构,没有调用Cat的析构;
}
class Animal2
{
public:
virtual void speak()
{
cout << "动物在说话" << endl;
}
//普通析构,是不会调用子类析构的,所以可能导致释放的不干净;
//所以采用虚析构;
virtual ~Animal2()
{
cout << "Animal2的析构调用" << endl;
}
};
class Cat2 :public Animal2
{
public:
Cat2(const char* name)
{
this->m_Name = new char[strlen(name) + 1];
strcpy_s(this->m_Name, strlen(name) + 1, name);
}
void speak()
{
cout << "小猫也在说话" << endl;
}
~Cat2()
{
if (this->m_Name != NULL) {
delete[] this->m_Name;
this->m_Name = NULL;
}
cout << "小猫的析构函数" << endl;
}
char * m_Name;
};
void test02()
{
Animal2 *cat2 = new Cat2("Tom");
cat2->speak();
delete cat2;
//此时先Cat2的析构,然后再是Animal2的析构;
//本来就可肯定应该调用Animal2的析构的;
}
class Animal3
{
public:
virtual void speak()
{
cout << "动物在说话" << endl;
}
//普通析构,是不会调用子类析构的,所以可能导致释放的不干净;
//所以采用虚析构;
//若采用纯虚析构;
//外部无法解析,因为纯虚析构没有实现,所以编译器无法通过;
//只能类内声明,类外实现;
//如果出现了纯虚析构函数,也算是抽象类了。
virtual ~Animal3() = 0;
};
Animal3::~Animal3()
{
cout << "Animal3的纯虚析构" << endl;
}
class Cat3 :public Animal3
{
public:
Cat3(const char* name)
{
this->m_Name = new char[strlen(name) + 1];
strcpy_s(this->m_Name, strlen(name) + 1, name);
}
void speak()
{
cout << "小猫也在说话" << endl;
}
~Cat3()
{
if (this->m_Name != NULL) {
delete[] this->m_Name;
this->m_Name = NULL;
}
cout << "小猫的析构函数" << endl;
}
char * m_Name;
};
void test03()
{
Animal3 *cat3 = new Cat3("Tom");
cat3->speak();
delete cat3;
}
int main()
{
test01();
test02();
test03();
return 0;
}