虚拟虚函数如何在c++中使用

  介绍

这篇文章给大家介绍虚拟虚函数如何在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++中使用