这篇文章给大家介绍虚拟虚函数如何在c++中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
c++中的虚函数用于解决<强>动态多态强>问题,虚函数的作用是允许在派生类中重新定义与积累同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。
首先写两个简单的类,类B继承自类,即一个是基类,B是派生类。
class 一个{ 公众: void 才能;print () { ,,,cout & lt; & lt;,“A", & lt; & lt;, endl; ,,} }; class B : public A { 公众: void 才能;print () { ,,,cout & lt; & lt;,“B", & lt; & lt;, endl; ,,} }; int main () { B 才能;b;//创建一个,B 类对象,b; A 才能,A =, b;//a 是,b 的一个,a 类引用; A 才能;* pa =,, b,,//pa 是一个指向,A 类对象的指针; a.print才能(); pa→才能打印(); b.print才能(); return 才能;0; }
程序中,A类和B类均定义了一个同名函数印刷,但两个函数的功能不同,编译系统按照<强>同名覆盖原则强>决定调用对象。
另外一点,引用的本质是指针常量,可以认为,爸爸都指向了B。(注意区分<强>常量指针强>与<强>指针常量>强,常量指针可以类比于整型指针,即指向一个常量的指针,指针的指向可以修改,指针常量类比于整型常量,即一个指针是个常量,也就是指针只能固定的指向某一单元,指针常量的指向不可改而指向的值可以修改。)
int A, B; int *, const p1 =,,,,//指针常量 const int * p2 =,, b,,//常量指针
执行函数后,我们发现结果为
因为是一个类的一个引用,所以的打印()依旧是一个类的成员函数;pa是一个类的指针,同理,而b是b类的对象,调用的打印()为b类的成员函数。简言之就是,没有虚拟时,调用哪一类的成员函数取决于调用对象,pa, b在定义时的类型。而此时,若b类对象b想调用直接基类的打印函数,则应当<代码> b。答::print() 代码>。
这种,pa, b能调用哪个同名函数在对象定义时已经确定好了的多态,我们称之为<强>静态多态>强。什么是<强>多态> 强大?同一个打印函数在不同的对象中有不同的作用,这就呈现了多态。
这里再提一点,原本基类指针是用来指向基类对象的,如果用它指向派生类对象,此时基类指针指向的是派生类对象中的基类部分。在没有虚函数时,基类指针是无法调用派生类对象中的成员函数的。
而当我们在一个类中()打印前加上关键字虚拟的,变成虚函数时
class 一个{ 公众: virtual 才能;void print () { ,,,cout & lt; & lt;,“A", & lt; & lt;, endl; ,,} }; class B : public { 公众: void 才能;print () { ,,,cout & lt; & lt;,“B", & lt; & lt;, endl; ,,} };
再次执行主函数,结果为
这是因为<强>虚拟跟着对象走>强,即调用的打印()究竟是一个类还是B类的成员函数取决于“调用者”,pa所指的对象B属于哪一类,而不再是取决于,pa本身在定义时的类型了。
这种用基类指针或引用指向某一派生类对象,从而能够调用指针指向的派生类对象中的函数的多态,我们称为<强>动态多态>强,虚拟正是实现动态多态的关键字。
虚函数表
接着刚才的话题,在一个类中有虚函数的前提下,我们继续讨论
class C { 公众: void 才能;print () { ,,,cout & lt; & lt;,“C", & lt; & lt;, endl; ,,} }; int main () { cout 才能;& lt; & lt;,“sizeof (A):,“, & lt; & lt;, sizeof (A), & lt; & lt;, endl; cout 才能;& lt; & lt;,“sizeof (B):,“, & lt; & lt;, sizeof (B), & lt; & lt;, endl; cout 才能;& lt; & lt;,“sizeof (C):,“, & lt; & lt;, sizeof (C), & lt; & lt;, endl; A 才能;; B 才能;b; C 才能;c; cout 才能;& lt; & lt;,“sizeof (a):,“, & lt; & lt;, sizeof (a), & lt; & lt;, endl; cout 才能;& lt; & lt;,“sizeof (b):,“, & lt; & lt;, sizeof (b), & lt; & lt;, endl; cout 才能;& lt; & lt;,“sizeof (c):,“, & lt; & lt;, sizeof (c), & lt; & lt;, endl; return 才能;0; }虚拟虚函数如何在c++中使用