在多态中,通常父类中的虚函数是没有意义的,因为多态就是用父类类型的变量调用子类的方法,详细的可以看这个C++多态的使用
因此可以把虚函数变成纯虚函数,当类中有了纯虚函数,这个类也称为抽象类
纯虚函数语法:virtual 返回值类型 函数名(参数列表)=0;
抽象类的特点:
1、无法实例化对象
2、子类必须重写父类的纯虚函数,否则也属于抽象类
注意:多态使用时,如果子类有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构函数代码
解决办法:把父类的析构函数改成虚析构或者纯虚析构
虚析构和纯虚析构共性:
1、都可以解决父类指针释放子类对象
2、都需要有具体的函数实现
虚析构和纯虚析构区别:
如果时纯虚析构,该类属于抽象类,无法实例化对象
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
class Animal
{
public:
Animal()
{
cout << "Animal的构造函数" << endl;
}
virtual void speak() = 0;
// virtual ~Animal() = 0;
virtual ~Animal(){
cout << "Animal虚函数析构" << endl;
}
};
// Animal::~Animal()
// {
// cout << "Animal纯虚函数析构" << endl;
// }
class cat : public Animal
{
public:
//如果不采用虚析构,那么name指针的值就无法释放,就会产生内存泄漏问题
string *name;
cat(string name)
{
cout << "cat的构造函数" << endl;
this->name = new string(name);
}
virtual void speak() //这里的virtual可写可不写
{
printf("cat is Speaking
");
}
~cat()
{
cout << "are小猫姓名为:" << name << endl;
delete name;
name = NULL;
}
};
void test()
{
Animal *a = new cat("Tom");
a->speak();
delete a;
a=NULL;
}
int main()
{
test();
return 0;
}