!!!!!!!!!!!!!!!!C++:派生类中重定义基类的成员函数与虚函数区别在哪里?

C++:派生类中重定义基类的成员函数与虚函数区别在哪里?搜索

2012-06-12 15:08 风雅风度  |  浏览 1387 次
  编程语言C语言函数
派生类定义的成员函数名可能和基类的成员函数名重复,如果原型完全相同,则派生类会有两个远行一模一样的函数,此时,派生类的函数会覆盖基类的函数。
而虚函数貌似只是在基类中多添加了一个virtual,并没有什么区别啊!求解答~
2012-06-12 15:42 提问者采纳
这涉及到多态的问题。
比如说你有一个基类BASE,有一个派生类Derived继承自BASE
两个类都有一个叫做fun的方法
然后你创建一个子类对象,但是用父类的指针(或者引用)指向他
例如:
BASE *b = new Derived();
如果你不加virtual
那么b.fun()调用的是父类的fun。因为b是父类指针,只能调用父类的方法,调用不到子类的方法。
如果你加上virtual
那么b.fun()调用的是子类的fun。因为加了virtual之后,会产生一个虚表,将fun函数放入虚表之内。当创建一个子类对象时,会自动“覆盖”父类的fun函数(你暂时这么理解就行)。b.fun()调用的是子类覆盖之后的fun函数。

也就是说,不加virtual,你的子类对象会有两个fun函数,一个父类的,一个子类的。
如果你加上virtual,你的子类只有一个fun函数,就是父类的fun函数。

简单说一下多态的作用吧。
比如说ATM,你要插借记卡,信用卡,VISA之类的,各种各样的银行卡。这些卡都是银行卡,所以银行卡是父类。而各种各样的卡是子类。
当ATM要取钱的时候,他不需要为每一种卡都写一个函数        借记卡.getMoney(),信用卡.getMoney()。
有了多态之后,他只需要写一个 银行卡的getMoney()函数就行了,将这个函数设置为virtual。多态的意义就是能够用父类指针来指向子类对象。而不同种类的卡(子类)只需要实现自己的getMoney().当使用银行卡调用getMoney函数时,程序会因为多态性,自动寻找子类的getMoney函数执行。
非常方便。

打字很辛苦啊。希望能采纳。有问题可以继续追问,我在线回答。
评论(3)  |  43  1
发布评论
2012-12-22 11:30 小猪小猪903
答得太好了,怒赞^ω^ 回复
2012-6-12 18:45 !!!!!!!!!!!!!!!!C++:派生类中重定义基类的成员函数与虚函数区别在哪里?_第1张图片 幻梦·人生
回复 peterde5:你可以这么理解,就是加上virtual之后,使用父类的指针和引用,可以访问到子类的virtual方法。 回复
2012-6-12 17:03 peterde5
也就是说,不加virtual,你的子类对象会有两个fun函数,一个父类的,一个子类的。 如果你加上virtual,你的子类只有一个fun函数,就是父类的fun函数。 这句话感觉不太对啊!应该是加上virtual就只有子类的fun函数吧! 回复

!!!!!!!!!!!!!!!!C++:派生类中重定义基类的成员函数与虚函数区别在哪里?_第2张图片

幻梦·人生 | 来自团队:我本军团 | 十五级 采纳率88%

擅长: C/C++ 操作系统/系统故障 常见软件 娱乐休闲

为您推荐:

按默认排序 | 按时间排序

其他1条回答

2012-06-12 15:27热心网友
如果加关键字 virtual,则是 override;
如果不加关键字 virtual,则跟作用域有关,基类与派生类的成员函数作用域不相同。
评论  |  0  0

虚函数的相关知识

  • 2011-10-15虚函数的定义 3
  • 2006-11-14虚函数 纯虚函数是一个东西吗? 179
  • 2008-05-01在c++中虚函数和多态性是什么意思 172
  • 2007-08-06C++中虚函数的作用是什么?它应该怎么用呢? 1717
  • 2010-05-21C++中的虚函数和重定义有什么区别 8
更多关于 虚函数的问题>>

等待您来回答

  • 0回答How to buy neverwinter astral diamonds xbox with 10% dis...
  • 0回答苹果6前置摄像头垫片移位是后封机吗
  • 0回答 30 android系统开发中的资源怎么理解
  • 0回答Android百度地图api可以把背景设置为灰白灰白的吗
  • 0回答TANK007手电筒RC11三个灯珠是不是一样的型号的呢?
  • 0回答Win10系统中svn不显示小图标怎么办
  • 0回答How strong is China’s economy?中国的经济有多坚韧
  • 2回答苹果6摄像头有灰,售后给换吗
  • 0回答Android 开发如何实现自己的ACtivity ?
  • 0回答 30 穷游android端的app中地图API用的是哪家的?
  • 0回答数字式振动控制系统rc-2000多少钱
  • 0回答Mac OS X 系统下面的HBuilder,我安装了HB自带的插件svn,但...
  • 0回答如何反驳 How to Disagree
  • 1回答三星9158大摄像头和三星p709大摄像头有区别吗 
  • 0回答android studio无法自动下载更新包
更多等待您来回答的问题>>

知道日报

2015.09.21 往期回顾
动物也会学习和创造?
id="baidu_clb_slot_iframe_1125477_0" src="about:blank" width="250" height="250" vspace="0" hspace="0" allowtransparency="true" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" style="border-width: 0px; vertical-align: bottom; margin: 0px; display: block;">

!!!!!!!!!!!!!!!!C++:派生类中重定义基类的成员函数与虚函数区别在哪里?_第5张图片

!!!!!!!!!!!!!!!!C++:派生类中重定义基类的成员函数与虚函数区别在哪里?_第6张图片

你可能感兴趣的:(C++)