虚函数:在函数前加关键字:virtual,函数变成虚函数
纯虚函数:函数体为0的虚函数叫做纯虚函数
抽象类:有纯虚函数的类叫做抽象类(纯虚类),抽象类不能创建对象,如果子类没有重写父类的纯虚函数,那么子类也是抽象类,抽象类,一般作为基类,虚函数在虚表中存放的是函数地址,纯虚函数在虚表中存放的是 0(虚表指针在我发的C++中的多态性中有介绍)
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Animal
{
public:
virtual void speak() = 0; //纯虚函数
};
class cat :public Animal
{
public:
virtual void speak()
{
cout << "cat speak" << endl;
}
};
void speak(Animal *a){
a->speak();
}
int main() {
speak(new cat());//打印出来的是 cat speak
return 0;
}
虚析构和纯虚析构
析构函数在继承关系中,编译器会将子类和父类的析构函数名字改为一样的,造成函数隐藏,下面代码的a是A类型的,所以会调用父类的析构函数,子类的不会调用。
让父类的析构函数是虚函数,这样就发生重写,这样调用的析构是子类的析构,会在子类的析构函数里面去调用父类的析构
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Animal
{
public:
Animal()
{
cout << "animal构造" << endl;
}
virtual ~Animal()
{
cout << "animal析构" << endl;
}
};
class cat :public Animal
{
public:
cat()
{
cout << "cat构造" << endl;
}
~cat()
{
cout << "cat析构" << endl;
}
};
int main() {
Animal *a = new cat;
delete a;
return 0;
}
纯虚函数的意义:
它为派生类提供了一个必须实现的接口规范。也就是说,派生类如果继承了包含纯虚函数的基类,就必须为这个纯虚函数提供具体的实现。
抽象类的意义:
抽象类是至少包含一个纯虚函数的类。
1.它提供了一个通用的抽象概念,为相关的类定义了一个公共的接口和框架。
2.强制派生类按照特定的方式实现某些功能。由于抽象类包含未实现的纯虚函数,所以不能创建抽象类的对象。但是可以通过指向抽象类的指针或引用操作派生类对象。
3.有助于实现代码的分层和模块化设计,提高代码的可维护性和可扩展性。不同的派生类可以根据具体需求实现抽象类中定义的接口,从而实现多态性。