C++中的纯虚函数和抽象类

发布于:2024-12-09 ⋅ 阅读:(162) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到