C++虚函数与纯虚函数区别和重载的概念 您所在的位置:网站首页 虚函数和纯虚函数的定义区别 C++虚函数与纯虚函数区别和重载的概念

C++虚函数与纯虚函数区别和重载的概念

2024-07-08 16:38| 来源: 网络整理| 查看: 265

虚函数定义

虚函数是在类中添加函数的修饰关键字“Virtual”,且对它进行定义,这时函数变被指定为虚函数。格式如下:12345class CInterFace{public: virtual void Func_Virtual(){}};

作用

虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。

引入原因

为了方便使用多态特性,常常需要在基类中定义虚函数。下面顺便列出C++实现多态的三个条件:

(1)在基类中将这些成员函数声明为虚函数,并实现(必须要实现)。

(2)在派生类中也声明这些成员函数并实现(必须实现),基类和派生类的这些函数必须同名,而且其形参个数和类型,返回值类型必须与基类中的这些函数完全相同。

(3)将派生类对象赋给基类的指针变量或者引用。至此,多态实现,可用基类指针或引用调用派生类的方法(符合多态条件的方法,而不是普通方法)。

相应的不是多态的情况:

(1)基类中声明为虚函数,派生类中也声明为虚函数,并且也同名。但是派生类中该函数的形参类型或者形参个数和基类中的不相同。此时,多态不满足,派生类和基类的这两个虚函数仅仅是隐藏关系,没有虚特性。

(2)基类中声明为虚函数,派生类中也声明了一个同名函数,但没有使用virtual,并且形参类型或者形参个数和基类不相同。这时候基类中的虚函数也丢失虚特性,派生类的该函数不会被虚化,当然也就够不成多态,这两个函数也仅仅是隐藏关系。

(3)基类中的函数不是虚函数,派生类中声明为虚函数,它们同名,这时也够不成多态,派生类的虚函数没有虚特性,它们也是隐藏关系。

(4)基类和派生类的两个函数同名,都是虚函数,形参的个数和类型也都相同,但是返回值类型不同,这时编译会报错,因为两个虚函数在隐藏时,返回值类型发生了冲突,因此隐藏发生错误。注意,如果这两个函数不是虚函数,这不会报错,隐藏会成功;同时,如果派生类中是虚函数,基类中不是虚函数,也不过报错,隐藏也是成功的。这也说明,虚化并隐藏时,返回值类型一定要保持相同。

实现机制

是通过虚函数表机制来实现的,当类中存在虚函数时,编译器会在类中自动生成一个虚函数表,并由编译器自动生成和维护,virtual 修饰的成员函数会被编译器放入虚函数表中。

虚表指针:指向自己所使用的虚表

虚函数表:虚函数表是顺序存放虚函数地址的,虚表是顺序表,表里存放了虚函数的地址。

纯虚函数定义

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

在基类中实现纯虚函数的方法是在函数原型后加“=0”

12345class CInterFace{public: virtual void Func_PureVirtual()=0;};

纯虚函数可以让类先具有一个操作名称,而没有操作内容,让派生类在继承时再去具体地给出定义。凡是含有纯虚函数的类叫做抽象类。这种类不能声明对象,只是作为基类为派生类服务。除非在派生类中完全实现基类中所有的的纯虚函数,否则,派生类也变成了抽象类,不能实例化对象。包含纯虚函数的类叫做抽象类( 也叫接口类) , 抽象类不能实例化出对象。 纯虚函数在派生类中重新定义以后, 派生类才能实例化出对象。

虚函数和纯虚函数总结

虚函数的定义形式:virtual {method body} 纯虚函数的定义形式:virtual { } = 0;

虚函数和纯虚函数可定义在同一个类(class)中,含有纯虚函数的类是抽象类(abstract class),而含有虚函数的类则不是。

虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用,因为纯虚函数在基类(base class)只有声明而没有定义。

在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时候要求前期bind,然而虚函数却是动态绑定(run-time bind),而且被两者修饰的函数生命周期(life recycle)也不一样。

函数重载定义

就是函数或者方法有相同的名称,但是参数列表不同的情形,这样的同名不同参数的函数之间,互相称之为重载函数。

重载的规则: 1、在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数可以是参数类型,参数个数,参数顺序(参数类型必须不一样);

2、不能通过访问权限、返回类型、抛出的异常进行重载;

3、方法的异常类型和数目不会对重载造成影响;

成员函数被重载的特征:

(1)相同的范围(在同一个类中);

(2)函数名字相同;

(3)参数不同;

(4)virtual 关键字可有可无 。

函数重载在同一个作用域内。,重载绝对不会发生在基类和派生类之间,在同一个类中,重载函数之间必须依靠形参个数或者形参类型来进行区分,不能依靠返回类型。

函数重载与虚函数的区别

1.函数重载可以用于非成员函数和类的成员函数,而虚函数只能用于类的成员函数

2.函数重载可用于构造函数,而虚函数不能用于构造函数

3.如果对成员函数进行重载,重载的函数与被重载的函数应该是用一个类中的成员函数,不能分属于两个不同继承层次的类,函数重载处理的是横向的重载。虚函数是对同一类族中的基类和派生类的同名函数的处理,即允许在派生类中对基类的成员函数重新定义。虚函数处理的是纵向的同名函数。

4.重载的函数必须具有相同的函数名,函数类型可以相同也可以不同,但函数的参数个数和参数类型二者中至少有一个不同,否则在编译时无法区分。而虚函数则要求同一类族中的所有虚函数的函数名,函数类型,函数的参数个数和参数类型都全部相同,否则就不是重定义了,也就不是虚函数了

5.函数重载是在程序编译阶段确定操作的对象的,属于静态关联。虚函数是在程序运行阶段确定操作对象的,属于动态关联。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有