C++虚函数与纯虚函数区别和重载的概念 | 您所在的位置:网站首页 › 虚函数和纯虚函数的定义区别 › C++虚函数与纯虚函数区别和重载的概念 |
虚函数定义 虚函数是在类中添加函数的修饰关键字“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 实验室设备网 版权所有 |