中易网

C++中virtual和非virtual版本对在派生类重写函数时候的有什么区别

答案:3  悬赏:40  
解决时间 2021-01-16 16:46
  • 提问者网友:风月客
  • 2021-01-15 23:24
C++中virtual和非virtual版本对在派生类重写函数时候的有什么区别
最佳答案
  • 二级知识专家网友:孤独入客枕
  • 2021-01-16 01:02
一:继承中的指针问题。
1. 指向基类的指针可以指向派生类对象,当基类指针指向派生类对象时,这种指针只能访问派生对象从基类继承而来的那些成员,不能访问子类特有的元素,除非应用强类型转换,例如有基类B和从B派生的子类D,则B *p;D dd; p=ⅆ是可以的,指针p只能访问从基类派生而来的成员,不能访问派生类D特有的成员.因为基类不知道派生类中的这些成员。
2. 不能使派生类指针指向基类对象.
3. 如果派生类中覆盖了基类中的成员变量或函数,则当声明一个基类指针指向派生类对象时,这个基类指针只能访问基类中的成员变量或函数。例如:基类B和派生类D都定义了函数f,则B *p; D m; p=&m; m.f()将调用基类中的函数f()而不会调用派生类中的函数f()。
4. 如果基类指针指向派生类对象,则当对其进行增减运算时,它将指向它所认为的基类的下一个对象,而不会指向派生类的下一个对象,因此,应该认为对这种指针进行的增减操作是无效的.
二:虚函数
1. 为什么要使用虚函数:正如上面第1和3点所讲的,当声明一个基类指针指向派生类对象时,这个基类指针只能访问基类中的成员函数,不能访问派生类中特有的成员变量或函数。如果使用虚函数就能使这个指向派生类对象的基类指针访问派生类中的成员函数,而不是基类中的成员函数,基于这一点派生类中的这个成员函数就必须和基类中的虚函数的形式完全相同,不然基类指针就找不到派生类中的这个成员函数。使用虚函数就实现了一个接口多种方法。
2. 注意不能把成员变量声明为虚有的,也就是说virtual关见字不能用在成员变量前面。
3. 正如上面所介绍的,一般应使用基类指针来调用虚函数,如果用点运算符来调用虚函数就失去了它的意义.
4. 如果基类含有虚函数则当声明了一个基类的指针时,当基类指针指向不同的派生类时,它就会调用相应派生类中定义的虚函数版本.这种调用方法是在运行时决定的,例如在类B中声明了虚函数,C,D,E都从B继承而来且都实现了自已的虚函数版本,那么当定义了一个B类的指针P时,当P指向子类C时就会调用子类C中定义的虚函数,当P指向子类D时就会调用子类D中定义的虚函数,当P指向子类E时就会调用子类E中定义的虚函数.
5. 虚函数须在基类中用virtual关见字声明也可以在基类中定义虚函数,并在一个或多个子类中重新定义.重定义虚函数时不需再使用virtual关见字,当然也可以继续标明virtual关见字,以便程序更好理解。
6. 包括虚函数的类被称为多态类.C++使用虚函数支持多态性.

其他的内容,去本人的文库下载相应的文章吧
全部回答
  • 1楼网友:末日狂欢
  • 2021-01-16 03:31
virtual 的函数, 会有多态。也就是,一个基类的指针、引用调用虚函数时,其具体调用的虚函数在运行时确定。
非virtual版本是重载,重载只是作用域不一样
  • 2楼网友:野慌
  • 2021-01-16 01:51
成员函数默认是非virtual函数。若在派生类中重写从基类继承的函数时,由于基类和派生类不是同一个作用域,基类中的函数被你自己在派生类中写的同名函数屏蔽,即派生类的对象通常不能再调用继承的那个函数了(但可以通过作用域操作符指定调用那个函数的基类版本)。
通过关键字virtual可以开启成员函数的动态绑定。若在派生类中重写从基类继承的virtual函数时,派生类中虚函数的声明必须与基类中的定义方式完全匹配,但有一个类外:返回对基类型的引用(或指针)的虚函数。派生类中的虚函数可以返回基类函数所返回类型的派生类的引用(或指针)。为什么要让他们的参数相同呢?这就要从重载确定开始说起,重载确定分为三个步骤:1、候选函数确定(找到函数调用所在处的作用域中的所有与被调函数同名的函数,若没有找到,则在当前作用域的外围作用域中寻找;若找到了,则不再考虑其外围作用域的同名函数);2、可用匹配;3、最佳匹配。要获得动态绑定,必须通过基类的引用或指针调用虚成员。当我们这样做时,编译器将在基类中查找函数。假定找到了名字,编译器就检查实参是否与形参匹配。如果我们改变了继承而来的虚函数的形参,那么,在应用了多态的地方编译器在编译时就会找不到匹配的函数了。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息