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

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

2012-06-12 15:08 风雅风度  |  浏览 1387 次
派生类定义的成员函数名可能和基类的成员函数名重复,如果原型完全相同,则派生类会有两个远行一模一样的函数,此时,派生类的函数会覆盖基类的函数。
而虚函数貌似只是在基类中多添加了一个virtual,并没有什么区别啊!求解答~
这涉及到多态的问题。
比如说你有一个基类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 幻梦·人生
回复 peterde5:你可以这么理解,就是加上virtual之后,使用父类的指针和引用,可以访问到子类的virtual方法。 回复
2012-6-12 17:03 peterde5
也就是说,不加virtual,你的子类对象会有两个fun函数,一个父类的,一个子类的。 如果你加上virtual,你的子类只有一个fun函数,就是父类的fun函数。 这句话感觉不太对啊!应该是加上virtual就只有子类的fun函数吧! 回复

为您推荐:

src="http://entry.baidu.com/rp/home?di=u2115503&rsi0=450&rsi1=25&type=pageembed&version=1&titff=sans-serif%2Ctahoma%2C%22MicrosoftYaHei%22&titfs=14&rss2=%232d64b3&rss3=%232d64b3&title=C%2B%2B%EF%BC%9A%E6%B4%BE%E7%94%9F%E7%B1%BB%E4%B8%AD%E9%87%8D%E5%AE%9A%E4%B9%89%E5%9F%BA%E7%B1%BB%E7%9A%84%E6%88%90%E5%91%98%E5%87%BD%E6%95%B0%E4%B8%8E%E8%99%9A%E5%87%BD%E6%95%B0%E5%8C%BA%E5%88%AB%E5%9C%A8%E5%93%AA%E9%87%8C%EF%BC%9F_%E7%99%BE%E5%BA%A6%E7%9F%A5%E9%81%93&ltu=http%3A%2F%2Fzhidao.baidu.com%2Fquestion%2F436687352.html%3Fqbl%3Drelate_question_0%26word%3D%25CE%25AA%25CA%25B2%25C3%25B4%25D3%25D0%25D0%25A9%25BA%25AF%25CA%25FD%25B6%25A8%25D2%25E5%25B3%25C9%25D0%25E9%25BA%25AF%25CA%25FD&ref=http%3A%2F%2Fzhidao.baidu.com%2Flink%3Furl%3D3T2dWQuh4Fs8KG1DBPmzmepOcIZDoHKuY21zf-RBHUPFQJwYp2CKBanhDhTxYhNKSkUE3M3Qa-0lKjezsIgZ_a&pageWidth=1808&pageHeight=846&t=1442822274236&iframeWidth=1808&iframeHeight=846" align="center,center" marginwidth="0" marginheight="0" class="BAIDU_SS_HHIFRAME" scrolling="no" frameborder="0" allowtransparency="true" style="width: 450px; height: 25px; background-color: transparent;">
按默认排序 | 按时间排序

其他1条回答

2012-06-12 15:27热心网友
如果加关键字 virtual,则是 override;
如果不加关键字 virtual,则跟作用域有关,基类与派生类的成员函数作用域不相同。
评论  |  0  0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值