纯虚函数 订阅
纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。纯虚函数也可以叫抽象函数,一般来说它只有函数名、参数和返回值类型,不需要函数体。这意味着它没有函数的实现,需要让派生类去实现。C++中的纯虚函数,一般在函数签名后使用=0作为此类函数的标志。Java、C#等语言中,则直接使用abstract作为关键字修饰这个函数签名,表示这是抽象函数(纯虚函数)。 展开全文
纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。纯虚函数也可以叫抽象函数,一般来说它只有函数名、参数和返回值类型,不需要函数体。这意味着它没有函数的实现,需要让派生类去实现。C++中的纯虚函数,一般在函数签名后使用=0作为此类函数的标志。Java、C#等语言中,则直接使用abstract作为关键字修饰这个函数签名,表示这是抽象函数(纯虚函数)。
信息
存在原因
方便使用多态特性
外文名
pure virtual function
其它名称
抽象函数
中文名
纯虚函数
归    类
计算机、C++
特    性
只有函数签名,没有实现
纯虚函数定义
纯虚函数是一种特殊的虚函数,它的一般格式如下(C++格式):class <类名>{virtual <类型><函数名>(<参数表>)=0;…};在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。纯虚函数可以让类先具有一个操作名称,而没有操作内容,让派生类在继承时再去具体地给出定义。凡是含有纯虚函数的类叫做抽象类。这种类不能声明对象,只是作为基类为派生类服务。除非在派生类中完全实现基类中所有的的纯虚函数,否则,派生类也变成了抽象类,不能实例化对象。一般而言纯虚函数的函数体是缺省的,但是也可以给出纯虚函数的函数体(此时纯虚函数仍然为纯虚函数,对应的类仍然为抽象类,还是不能实例化对象)调用纯虚函数的方法为:抽象类类名::纯虚函数名(实参表)
收起全文
精华内容
下载资源
问答
  • 该资源是博主博客的源代码,博客上有详细讲解Qt/C++关于纯虚函数和抽象基类原理讲解和示例用法解释,博客地址如下: https://blog.csdn.net/naibozhuan3744/article/details/94488200 其中编译环境为QtCreator4.5.0...
  • 什么是纯虚函数 纯虚函数的作用 如何定义使用纯虚函数   一 定义: 纯虚函数是一种特殊的虚函数,它的一般格式如下:   class <类名>   {   virtual <类型><函数名>(&...
    什么是纯虚函数 纯虚函数的作用 如何定义使用纯虚函数  


    一 定义:

    纯虚函数是一种特殊的虚函数,它的一般格式如下: 
      class <类名> 
      { 
      virtual <类型><函数名>(<参数表>)=0; 
      … 
      }; 
      在许多情况下,在基类中不能对虚函数给出有意义有实现,而把它说明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。

    二 引入原因:

    1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。 
      2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。 
      为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重载以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。

    三 特性:

     

    1、多态性

      指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。

      a.编译时多态性:通过重载函数实现

      b 运行时多态性:通过虚函数实现。

      2、虚函数

      虚函数是在基类中被声明为virtual,并在派生类中重新定义的成员函数,可实现成员函数的动态重载

      3、抽象类

      包含纯虚函数的类称为抽象类。由于抽象类包含了没有定义的纯虚函数,所以不能定义抽象类的对象。

     
    展开全文
  • 主要介绍了C++中虚函数与纯虚函数的用法,是非常重要的概念,需要的朋友可以参考下
  • 1.虚函数 1.1虚函数简介 虚函数可以毫不夸张的说是C++最重要的特性之一,我们先来看一看虚函数的概念。 在基类的定义中,定义虚函数的一般形式为: virtual 函数返回值类型 虚函数名(形参表) { 函数体 } 为什么...
  • 纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数! 虚函数 引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数。 class Cman { public: virtual void Eat(){……}; void ...
  • 只有用virtual声明类的成员函数,使之成为虚函数,不能将类外的普通函数声明为虚函数。因为虚函数的作用是允许在派生类中对基类的虚函数重新定义。所以虚函数只能用于类的继承层次结构中。  一个成员函数被声明为...
  • 纯虚函数实现接口并且做成了dll动态链接库
  • 纯虚函数

    2019-09-25 22:21:17
    文章目录什么是纯虚函数使用纯虚函数的注意事项 什么是纯虚函数 纯虚函数(pure virtual function)是指被标明为不具体实现的虚拟成员函数。通常情况下,纯虚函数常用在这种情况:定义一个基类时,基类中虚函数的...

    什么是纯虚函数

    纯虚函数(pure virtual function)是指被标明为不具体实现的虚拟成员函数。通常情况下,纯虚函数常用在这种情况:定义一个基类时,基类中虚函数的具体实现由于必须依赖派生类的具体情况从而无法在基类中确切定义,此时可以把这个虚函数定义为纯虚函数
    在这里插入图片描述

    使用纯虚函数的注意事项

    1. 含有纯虚函数的基类是不能用来定义对象的。纯虚函数没有实现部分,不能产生对象,所以含有纯虚函数的类是抽象类
    2. 定义纯虚函数时,不需要定义函数的实现部分(因为没有意义,即使定义了函数的实现部分,编译器也不会对这部分代码进行编译)
    3. “=0” 表明程序员将不定义该函数,函数声明是为派生类保留一个位置。“=0” 的本质是将指向函数体的指针定位 NULL
    4. 派生类必须重定义基类中的所有纯虚函数,少一个都不行,否则派生类中由于仍包含纯虚函数(从基类中继承而来),系统会仍将该派生类当成一个抽象类而不允许其实例
    #include<iostream>
    using namespace std;
    class Animal{ //基类,抽象类
    public:
        virtual void eat()=0; //纯虚函数 
        virtual void sleep()=0; 
    };
    
    class Person:public Animal{ //子类1
    public:
        void eat(){
            cout<<"Person eat"<<endl;
        } 
        void sleep(){
            cout<<"Person sleep"<<endl;
        }
    }; 
    
    class Dog:public Animal{ //子类2
    public:
        void eat(){
            cout<<"Dog eat"<<endl; 
        } 
        void sleep(){
            cout<<"Dog eat"<<endl;
        }
    };
    
    void func(Animal &a){
        a.eat();
        a.sleep();
    }
    int main(){
        Person person;
        func(person);
        cout<<"------分界线-----------"<<endl;
        Dog dog;
        func(dog);
        return 0;
    }
    

    在这里插入图片描述

    展开全文
  • 《Visual C++2012入门经典(第6版)》实例
  • 本篇文章是对c++中虚函数与纯虚函数的区别进行了详细的分析介绍,需要的朋友参考下
  • 本篇文章主要介绍了C++中的普通成员函数、虚函数以及纯虚函数,非常的详细,有需要的朋友可以参考下
  • C++中虚函数和纯虚函数的区别

    千次阅读 2020-12-20 16:14:18
    } 代码输出: it's child 1 it's child 2 总结: 虚函数和纯虚函数都是为了多态这一特性而服务的,不同的点是纯虚函数将父类上升为一个抽象类,无法实例化对象,只有接口声明,而其子类需要去实现父类中的声明,这...

    C++面向对象程序设计有三大思想:抽象、继承、多态

    其中多态的实现建立在子类继承父类的基础上,它是由C++编译器的一个核心技术实现,即动态绑定技术。其核心思想是父类对象调用子类对象的方法。而父类对象调用子类对象的方法时,这个被调用的方法必须在父类中声明为虚函数,因此虚函数是实现多态的一个中介。而纯虚函数是将父类上升为一个抽象类,抽象类无法实例化,只有方法的声明,其实现由其子类完成。就像动物无法实例化为具体的对象,而老虎、狮子都可以继承动物的特性(即父类的接口),从而有自己的实例化对象。

    以下是虚函数和纯虚函数的区别点:

    1、类如果声明了虚函数,这个函数是实现了的,即使是空实现,它的作用就是为了能让这个函数在它的子类里面可以被覆盖,这样编译器就可以使用动态绑定来达到多态的目的(即父类指针指向子类对象,调用子类方法)。而纯虚函数只是在基类中的一个函数定义,即是一个函数声明而已,具体的实现需要留到子类当中。

    2、虚函数在子类里面也可以不进行重写(只有虚方法和抽象方法才能够被重写);但纯虚函数必须在子类去实现。

    3、虚函数的类用于“实作继承”,也就是说继承接口的同时也继承了父类的实现。当然,子类也可以进行覆写,从而完成自己关于此函数的实现。纯虚函数的类用于“介面继承”,即纯虚函数关注的是接口的统一性,实现由子类去完成。

    4、带纯虚函数的类叫做抽象类,这种类不能直接生成对象,而只有被继承,并重写其虚函数后,才能使用。

    代码示例:

    #include <iostream>
    using namespace std;
    
    // 抽象类
    class Base {
    public:
        virtual void func() = 0;	// 纯虚函数
    };
    
    
    class child1 : public Base {
    public:
    	void func() { cout << "it's child 1" << endl; }	// 覆写父类的纯虚函数
    };
    
    class child2 : public Base {
    public:
    	void func() { cout << "it's child 2" << endl; }	// 覆写父类的纯虚函数
    };
    
    int main() {
    	// Base b; // 纯虚函数无法实例化
    	Base* b = nullptr; // 父类指针
    	child1 c1; // 子类对象
    	child2 c2; // 子类对象
    
    	b = &c1;
    	b->func();	// 多态
    
    	b = &c2;
    	b->func();	// 多态
    	return 0;
    }
    

    代码输出:

    it's child 1
    it's child 2
    
    

    总结:

    虚函数和纯虚函数都是为了多态这一特性而服务的,不同的点是纯虚函数将父类上升为一个抽象类,无法实例化对象,只有接口声明,而其子类需要去实现父类中的声明,这就统一了接口,只需要使用父类指针,指向具体的子类对象,去调用相应的虚方法即可。

    谢谢阅读

    展开全文
  • C++之纯虚函数

    2020-04-03 17:20:45
    C++没有接口类,它通过使用纯虚函数来生成抽象类。抽象类可以作为接口的集合,实现了接口类的功能。 C++中含有纯虚函数的类叫做抽象类,顾名思义,它本身就是行为抽象的集合,因此它只描述了有这个行为,但是并未...

    C++没有接口类,它通过使用纯虚函数来生成抽象类。抽象类可以作为接口的集合,实现了接口类的功能。

    C++中含有纯虚函数的类叫做抽象类,顾名思义,它本身就是行为抽象的集合,因此它只描述了有这个行为,但是并未描述行为的具体做法,具体的做法在派生类中去实现,不同的派生类有不同的实现。

    纯虚函数是虚函数的特殊表现,它的一般形式:

    class  类名
    {
        virtual  函数返回值类型  函数名  (参数列表) = 0;    //即,抽象类不去实现函数体
    };

    实际上C++允许抽象类实现函数体,但是做为抽象类的人应当遵循所有子类都有的行为才可以在抽象类中实现。否则这与抽象类的设计理念相违背。

    抽象类不能被实例化,因为大多数时候的抽象类的纯虚函数都没有相应的实现。

    由于基类的指针(引用)可以使用子类的函数,这样,我们通过抽象类的指针可以去调用派生类对象的函数。

    下面是一段代码来展示抽象类和纯虚函数。

    #include<iostream>
    
    constexpr double PI = 3.1415926;
    
    using std::endl;
    using std::cout;
    
    class Figure			//抽象类
    {
    public:
    	//定义纯虚函数
    	virtual double getArea() const = 0                      //获取面积
    	{	
    		cout << "Hello World" << endl;	//实际上C++允许我们在抽象类中实现纯虚函数的函数体
    		return 0;
    	}
    	virtual double getCircum() const = 0;					//获取周长
    };
    
    class Rect : public Figure
    {
    public:
    	Rect(double a,double b);
    	virtual double getArea()const
    	{
    		Figure::getArea();		//由于抽象类不能实例化,只能这样在派生类中调用。不能在类外调用
    		return a * b;	
    	}
    	virtual double getCircum()const
    	{
    		return 2 * (a + b);
    	}
    private:
    	double a;
    	double b;
    };
    
    Rect::Rect(double a, double b)
    {
    	this->a = a;
    	this->b = b;
    }
    
    class Triangle : public Figure
    {
    public:
    	Triangle(double a,double b,double c);
    	virtual double getArea()const
    	{
    		//利用海伦公式计算三角形面积
    		double p = (a + b + c) / 2;
    		double tmp = p * (p - a) * (p - b) * (p - c);
    		return pow(tmp, 0.5);
    	}
    	virtual double getCircum()const
    	{
    		return a + b + c;
    	}
    private:
    	double a;
    	double b;
    	double c;
    };
    
    Triangle::Triangle(double a, double b, double c)
    {
    	this->a = a;
    	this->b = b;
    	this->c = c;
    }
    
    class Circle : public Figure
    {
    public:
    	Circle(double r);
    	virtual double getArea()const
    	{
    		return PI * r * r;
    	}
    	virtual double getCircum()const
    	{
    		return 2 * PI * r;
    	}
    private:
    	double r;
    };
    
    Circle::Circle(double r)
    {
    	this->r = r;
    }
    
    
    int main()
    {
    	//Figure f;			---->error,抽象类不能实例化对象。
    
    	Figure* p_rect = new Rect(4, 6);
    	Figure* p_triangle = new Triangle(3, 3, 3);
    	Figure* p_circle = new Circle(10);
    
    	cout << "矩形面积:" << p_rect->getArea() << "     矩形周长:" << p_rect->getCircum() << endl;
    	cout << "三角形面积:" << p_triangle->getArea() << "     三角形周长:" << p_triangle->getCircum() << endl;
    	cout << "圆形面积:" << p_circle->getArea() << "     圆形周长:" << p_circle->getCircum() << endl;
    	
    
    	return 0;
    }

    运行结果如下:

    通过多态,基类指针可以访问子类的函数。

    展开全文
  • C++ 纯虚函数

    千次阅读 2019-11-28 20:56:50
    虚函数 在基类中将一个函数声明为虚函数...声明纯虚函数可使当前类变成抽象类,禁止该类被实例化,并要求其非抽象类的派生类必须实现该函数。 下面展示虚函数和纯虚函数的代码示例,注意观察注释内容: class Ba...
  • 什么是纯虚函数 1、虚函数: 在基类中将一个函数声明为虚函数,使该函数具有虚属性,那么其所有派生函数中该函数的重写都具备了虚属性,也就使得基类指针可以调用派生类实例中继承自该基类的所有成员函数,且若有...
  • 纯虚函数的应用

    2020-10-27 21:29:24
    纯虚函数的定义 在C++中,只有虚函数才能被声明为纯虚函数,语法格式为: virtual 返回值类型 函数名(函数参数)=0; 其中,纯虚函数没有函数体,只有函数声明,也就是在类中的虚成员函数后面加上=0,来表示这是...
  • 虚函数与纯虚函数(详细讲解)

    千次阅读 多人点赞 2019-06-12 17:31:56
    首先:强调一个概念 ...定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。 1、简介 假设我们有下面的类层次: class A { public: virtual void foo() ...
  • 一个类的虚函数在它自己的构造函数和析构函数中被调用的时候,它们就变成普通函数了,不“虚”了。也就是说不能在构造函数和析构函数中让自己“多态”。
  • c++纯虚函数与虚函数

    2020-01-09 13:09:16
    定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。 纯虚函数 纯虚函数形为 virtual void run() = 0; 纯虚函数在基类中是一定没有定义的 只会在基类中声明,并且...
  • 函数(impure virtual) C 的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现。 子类可以重写父类的虚函数实现子类的特殊化。 如下就...
  • 虚函数和纯虚函数详解

    千次阅读 2018-09-09 23:05:44
    但让人惊奇的是,C++仍然保留了基类提供该纯虚函数代码实现的权利,这也许是给千变万化的实际情况留下后路 void aircraft::fly() { // 一种不应该被使用的缺省飞行方案 } 有了基类aircraft,我们就可以潇洒地派生出...
  • 一直对虚函数有点虚,特意google了一下,以下2文章差不多,转载如下,同时添加上一些我的测试结果。 https://blog.csdn.net/yusiguyuan/article/details/12676177 ... 首先:强调一个概念 定义一个函数为虚函数,不...
  • 纯虚函数:前面有virtual,在父类里面有定义,但是不实现。后面必须跟“=0”,如: virtual void chunxu()=0; 二者格式: 虚函数-- virtual xuhanshu(){ method body }; 纯虚函数--virtual chunxu()=0;.....
  • (纯虚函数) 然后细分一下,动物有猫狗羊和人。(继承) 人类明确它们物种的时候(明确类型的派生类指针) 猫吃鱼 狗吃肉 羊吃草 猫喵喵 狗汪汪 羊咩咩(多态 同名覆盖) 一切都如此顺理成章。 突然人发现一只动物! 这...
  • c++的多态以及虚函数,纯虚函数都是面试常问的问题 所以我今天专门更新一篇关于c++的虚函数和纯虚函数的博文 虚函数的语法 在类成员方法的声明语句之前加上virtual 他就会变成虚函数 在虚函数的声明语句末尾加上**=0...
  • 关于C++子类继承父类纯虚函数的注意事项欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,809
精华内容 15,923
关键字:

纯虚函数