什么是虚函数和纯虚函数,有什么区别

2020-11-23 13:44:56 字数 4324 阅读 5786

1楼:

虚函数是在基类中作总体框架定义,定义时在函数的返回类型名前加上virtual构成。它的具体不同实现版本是在其类的派生类里实现的。纯虚函数是在其类中连基本框架都定义不出来,所以只是用“virtual 类型名 函数名()=0;”的形式来声明基类中有这么一个函数,而它的实现则完全由基类的派生类根据不同需要来完成。

有纯虚函数的基类叫抽象类,不能被实例化(即不能生成对象),只能被继承。我的理解是:虚函数实现的具体版本中总是有通用的部分,这些通用部分可以在基类中定义,而纯虚函数则完全没有能共用的部分,完全是由派生类中不同的实现完成的。

供参考……

2楼:匿名用户

自己看书吧,书上说的比谁都清楚。推荐一本, c++ primer plus...

什么是虚函数,c++虚函数讲解

3楼:千锋教育

在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) ;实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。

虚函数定义:简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(polymorphi**),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异,而采用不同的策略。

虚函数的作用:用同一个调用形式,既能调用派生类又能调用基类的同名函数。

虚函数的使用方法是:

在基类用virtual声明成员函数为虚函数。这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便地被调用。在类外定义虚函数时,不必再加virtual。

在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。c++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。因此在派生类重新声明该虚函数时,可以加virtual,也可以不加,但习惯上一般在每一层声明该函数时都加virtual,使程序更加清晰。

如果在派生类中没有对基类的虚函数重新定义,则派生类简单地继承其直接基类的虚函数。

定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象。

通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数。通过虚函数与指向基类对象的指针变量的配合使用,就能方便地调用同一类族中不同类的同名函数,只要先用基类指针指向即可。如果指针不断地指向同一类族中不同类的对象,就能不断地调用这些对象中的同名函数。

这就如同前面说的,不断地告诉出租车司机要去的目的地,然后司机把你送到你要去的地方。

有纯虚函数的类和有虚函数的类相比,又有什么区别

4楼:匿名用户

纯虚函数的类在其派生类中必须定义自己这个函数的版本,而且纯虚函数是没有实际意义的,他的目的告知编译器派生类将会定义自己的版本。

类中拥有纯虚函数表示这个类是抽象类,不存在此类的对象。

而虚函数仅表示派生类可以定义自己的版本,但是基类也可以有意义,若没有定义自己的版本,将使用基类的版本。

5楼:匿名用户

纯虚函数是一种特殊的虚函数,它的一般格式如下:

class 《类名》

;在许多情况下,在基类中不能对虚函数给出有意义有实现,而把它说明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。

[编辑本段]

二、引入原因

1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。

2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。

为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual returntype function()= 0;),则编译器要求在派生类中必须予以重载以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。

这样就很好地解决了上述两个问题。

[编辑本段]

三、相似概念

1、多态性

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

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

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

2、虚函数

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

3、抽象类

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

程序举例:

基类:class a

;子类:

class b : public a

;主函数:

int main(int argc, char* argv)

f1()是一个隐藏,关于函数的隐藏,可以参考其它词条.

调用m_j->f1();会去调用a类中的f1(),它是在我们写好**的时候就会定好的.

也就是根据它是由a类定义的,这样就调用这个类的函数.

f2()是普通的重载.

调用m_j->f2();会调用m_j中到底保存的对象中,对应的这个函数.这是由于new的b

对象.f3()与f2()一样,只是在基类中不需要写函数实现.请参考

c++中 虚函数与纯虚函数的区别是什么?

6楼:月无痕

虚函数与纯虚函数 在他们的子类中都可以被重写。它们的区别是:

(1)纯虚函数只有定义,没有实现;而虚函数既有定义,也有实现的**。

纯虚函数一般没有**实现部分,如

virtual void print() = 0;

而一般虚函数必须要有**的实现部分,否则会出现函数未定义的错误。

virtual void print()

(2)包含纯虚函数的类不能定义其对象,而包含虚函数的则可以。

什么是抽象类?什么是纯虚函数?纯虚函数跟一般的虚函数有什么区别?

7楼:鸢尾的念想

纯虚函数和抽象类:

含有纯虚函数的类是抽象类,不能生成对象,只能派生。他派生的类的纯虚函数没有被改写,那么,它的派生类还是个抽象类。

定义纯虚函数就是为了让基类不可实例化化,因为实例化这样的抽象数据结构本身并没有意义.或者给出实现也没有意义。定义纯虚函数的一般形式为:

class 类名;

纯虚函数是一个在基类中说明的虚函数,它在基类中没有定义,要求任何派生类都定义自己的版本。纯虚函数为各派生类提供一个公共界面。

从基类继承来的纯虚函数,在派生类中仍是虚函数。

8楼:齐哥

抽象类就是含有纯虚函数的类。纯虚函数跟虚函数在声明形式上和意义都有很大区别。具体讲解可以参见 http:

//****jizhuomi.***/software/125.

html 。

虚函数和抽象函数有什么区别?

9楼:许诗文

虚函数是有**的并明确允许子类去覆盖,但子类也可不覆盖,就是说可以直接用,不用重写 。

抽象函数是没有**,子类继承后一定要重写

在一个类中用虚函数:

是因为在超类中的有实际**的方法,但明确允许子类可以作重写

而且当子类重写后,可以用子类实例超类;如果这样,超类变量调用虚函数时,执行的是子类的方法

在一个类中用抽象函数

是在写超类时不确定函数的**,让子类去实现

抽象函数没有方法体。

简单来说虚函数(virtual)已经包含了也必须包含默认的实现,所以在派生类中可以重新实现也可以不实现这些虚函数。

抽象函数(abstract)没有提供默认实现,所以在派生类中必须实现这些抽象函数。

接口中的函数类似于抽象函数,也不提供默认实现,实现接口的类也必须实现这些函数。

但接口可用于多继承,即,类只能从一个类继承,但可同时实现多个接口。

10楼:匿名用户

纯虚函数是一种特殊的虚函数,它的一般格式如下:

class <类名>

;在许多情况下,在基类中不能对虚函数给出有意义有实现,而把它说明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。

抽象类带有纯虚函数的类称为抽象类。抽象类是一种特殊的类,它是为了抽象和设计的目的而建立的,它处于继承层次结构的较上层。抽象类是不能定义对象的,在实际中为了强调一个类是抽象类,可将该类的构造函数说明为保护的访问控制权限。

抽象类的主要作用是将有关的组织在一个继承层次结构中,由它来为它们提供一个公共的根,相关的子类是从这个根派生出来的。

c中的纯虚函数和java中的接口到底可以搞什么东西

1楼 帅的都想毁容 接口的好处很多 以c 为例 可以以子类指针动态找到某个方法的实现 不同子类实现不同 可以实现跨平台功能 可以实现接口功能模块及调用接口的模块的同时开发总之好处很多 c 中的虚函数和java中的抽象方法有什么区别? 2楼 南在南方之南 c 虚函数 与java中抽象函数比较 1 ja...

js中函数名和jquery选择器有什么区别

1楼 喜剧 其实jquery就是封装了了geteelementbyid等方法来获取dom的信息,然后赋值给jquery对象。 所以说 只是jquery的函数表示而已,有时候引用了jquery但是不想用它的 来作为选择器用,就要用到noconfit方法来区分。 javascript和jquery选择器...

复变函数的泰勒级数,复变函数的级数和普通级数的泰勒有什么区别

1楼 匿名用户 没什么技巧,其实就是合并同类项而已 前一个级数z n的系数为i n n , 后一个级数z n的系数为 i n n , 相减后z n的系数为 i n i n n 1 1 n i n n 由此可见当n为偶数时,上式 0 当n为奇数时,上式 2i n n 相减后的级数没有偶次项 即只有奇次...