虚函数:在函数前加关键字: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 speakreturn 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.有助于实现代码的分层和模块化设计,提高代码的可维护性和可扩展性。不同的派生类可以根据具体需求实现抽象类中定义的接口,从而实现多态性。