关于计算机编程的一点理解(4)

8.面向对象的中虚函数

记得刚看到这个词大概是大一下学期。觉得挺玄乎的、挺高级的。当然也激发了我的兴趣。记得有一句话:一切都是对象(Everything is object),大有放之四海而皆准的味道

其实我觉得,面向对象的关键就是封装,只暴露最必要的部分,而把所有不必要的部分隐藏起来。毕竟,什么东西都从头做起是得不偿失的,所以,我们希望把以前的东西做得能够反复使用,就是重用。封装对于重用有很大的作用,因为它简化了接口。但除了封装还有继承,这个东西,极大的简化了软件的开发,我们只要从一个类继承,我们的类就拥有了基类的全部特征。

当然除了这些,C++更进一步,引入虚函数概念(virtual)。虚这个东西,太能引起人的遐想,哈哈,也许叫瞎想更恰当。我看到这个字就想到“太虚”这个词,查了下,《道德经》有“道大而虚静”之说,原来太虚就是指得道的一种境界,道本来就够虚了,得道的境界就更虚了,果然太虚。

差点忘了,还有一个很重要的概念叫多态(Polymorphism。其实多态就是用虚函数实现的。其实道理还是挺简单的,打个比方:

比如一个公司,有很多员工,可能有秘书、经理、保洁员啊什么的,它们可以看做都是从员工继承的。这些员工都要工作,按公司规定所有的员工八点钟开始工作。在软件中可以设想在八点调用所有的员工的“工作”函数,向他们发送通知开始工作,那么这段程序不希望去分辨员工是什么职位,它只想通知他们工作而已,这就需要“工作”函数具有多态性,即:希望不同的员工的“工作”函数能够适合于员工对象。虚函数能够达到这个作用,它是采用动态绑定实现的,具体就是在对象的起始位置放入一个指针vptr指向一个虚表(virtualtable),该表中放入虚函数地址。无论怎么继承,同名的虚函数地址在虚表中的地址不变,我们通过this指针取得虚表,再取得虚函数地址。不过,不同的对象根据其类型不同,在编译时就把虚表中的同名虚函数的指针指向了不同函数,所以导致运行时的多态。要利用虚函数来实现多态,需要使用指针或者引用,函数传参时使用对象是不行的。

在C++中除了虚函数,还有普通函数,它们的调用绑定是在编译期完成的。其实虚函数的调用也是编译成机器语言了的,只不过多了几道手续。顺便提一句,为了简化,现代的一些语言像Java,C#就只剩下虚函数了。

要说明这些,画几张图是蛮好的,不过太麻烦,加上百度一下,讲这个蛮多,所以就不自找麻烦了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值