虚函数和虚函数表
虚函数和虚函数表
(1) 虚函数:C++中的虚函数的作⽤主要是实现了多态的机制。
关于多态,简⽽⾔之就是⽤⽗类型的指针指向其⼦类的实例,然后通过⽗类的指针调⽤实际⼦类的成员函数。这种技术可以让⽗类的指针
有“多种形态”,这是⼀种泛型技术。
如果调⽤⾮虚函数,则⽆论实际对象是什么类型,都执⾏基类类型所定义的函数。⾮虚函数总是在编译时根据调⽤该函数的对象,引⽤或指针的类型⽽确定。如果调⽤的是虚函数,则直到运⾏时才能确定调⽤哪个函数,运⾏的虚函数是引⽤所绑定或指针所指向的对象所属类型定义的版本。
虚函数必须是基类的⾮静态成员函数。虚函数的作⽤是实现动态联编,也就是在程序的运⾏阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派⽣类中对虚函数重新定义,在派⽣类中重新定义的函数应与虚函数具有相同的形参个数和形参类型。以实现统⼀的接⼝,不同定义过程。如果在派⽣类中没有对虚函数重新定义,则它继承其基类的虚函数。
虚函数带来的好处就是: 可以定义⼀个基类的指针, 其指向⼀个继承类, 当通过基类的指针去调⽤函数时, 可以在运⾏时决定该调⽤基类的函数还是继承类的函数. 虚函数是实现多态(动态绑定)/接⼝函数的基础. 可以说: 没有虚函数, C++将变得⼀⽆是处!
(2)纯虚函数: 纯虚函数只有函数的名字⽽不具备函数的功能,不能被调⽤。它只是通知编译系统:“在这⾥声明⼀个虚函数,留待派⽣类中定义”。在派⽣类中对此函数提供定义后,它才能具备函数的功能,可被调⽤。声明纯虚函数的⼀般形式是
virtual 函数类型 函数名 (参数表列)=0;
指针函数的作用纯虚类也称抽象类,凡是包含纯虚函数的类都是抽象类。因为纯虚函数是不能被调⽤的,包含纯虚函数的类是⽆法建⽴对象的。
抽象类的作⽤是作为⼀个类族的共同基类,或者说,为⼀个类族提供⼀个公共接⼝。
虚函数表:为了实现C++的多态,C++使⽤了⼀种动态绑定的技术。这个技术的核⼼是虚函数表。每个包含了虚函数的类都包含⼀个虚表。为实现动态联编,编译器为每个包含虚函数的类创建⼀个表,称为vtable,在vtable中,编译器放置了特定类的虚函数地址,在每个带有虚函数的类中编译器会秘密地设置⼀个虚函数表指针,称为vptr,指向对象的vtable,通过基类指针做虚函数调⽤时,也就是多态
调⽤时,编译器静态地插⼊取得这个vptr,并在vtable表种查函数地址的代码,这样就能调⽤正确的函数。
动态联编是指在程序执⾏的时候才将函数实现和函数调⽤关联,因此也叫运⾏时绑定或者晚绑定,动态联编对函数的选择不是基于指针或者引⽤,⽽是基于对象类型,不同的对象类型将做出不同的编译结果。C++中⼀般情况下联编也是静态联编,但是⼀旦涉及到多态和虚拟函数就必须要使⽤动态联编了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。