最近更新   设为主页   C++的不足之处讨论系列一 加入收藏  
计算机基础教程网 本站招聘  
 [投稿登 陆]    [问题求解或论坛登 陆]
ITWEN首页操作系统网络冲浪办公软件网页设计图形图象认证考试程序设计数据库其它文章交流论坛  
  当前位置:ITWen >>  C&C++语言  >>  C++的不足之处讨论系列一
C++的不足之处讨论系列一
作者:ItWen收集整理    来源:www.itwen.com    更新时间:2006-11-23
[ 收藏此页到: 天天 | 和讯 | 博采 | ViVi | 狐摘 | 我摘 ]  
  


以下文章翻译自Ian Joyner所著的
《C++?? A Critique of C++ and Programming and Language Trends of the 1990s》 3/E【Ian Joyner 1996】
原著版权属于Ian Joyner,
征得Ian Joyner本人的同意,我得以将该文翻译成中文。因此,本文的中文版权应该属于我;-)
该文章的英文及中文版本都用于非商业用途,你可以随意地复制和转贴它。不过最好在转贴它时加上我的这段声明。
如有人或机构想要出版该文,请最好联系原著版权所有人及我。
该篇文章已经包含在Ian Joyner所写的《Objects Unencapsulated 》一书中(目前已经有了日文的翻译版本),该书的介绍可参见于:
http://www.prenhall.com/allbooks/ptr_0130142697.html
http://efsa.sourceforge.net/cgi-bin/view/Main/ObjectsUnencapsulated
http://www.accu.org/bookreviews/public/reviews/o/o002284.htm
Ian Joyner的联系方式:
i.joyner@acm.org
我的联系方式:
cber@email.com.cn
前言:【译者所写的】
要想彻底的掌握一种语言,不但需要知道它的长处有哪些,而且需要知道它的不足之处又有哪些。这样我们才能用好这门语言,也才能说我们自己掌握了这门语言。
C++的不足之处讨论系列(一)
虚拟函数
在所有对C++的批评中,虚拟函数这一部分是最复杂的。这主要是由于C++中复杂的机制所引起的。虽然本篇文章认为多态(polymorphism)是实现面向对象编程(OOP)的关键特性,但还是请你不要对此观点(即虚拟函数机制是C++中的一大败笔)感到有什么不安,继续看下去,如果你仅仅想知道一个大概的话,那么你也可以跳过此节。【译者注:建议大家还是看看这节会比较好】

在C++中,当子类改写/重定义(override/redefine)了在父类中定义了的函数时,关键字virtual使得该函数具有了多态性,但是virtual关键字也并不是必不可少的(只要在父类中被定义一次就行了)。编译器通过产生动态分配(dynamic dispatch)的方式来实现真正的多态函数调用。
这样,在C++中,问题就产生了:如果设计父类的人员不能预见到子类可能会改写哪个函数,那么子类就不能使得这个函数具有多态性。这对于C++来说是一个很严重的缺陷,因为它减少了软件组件(software components)的弹性(flexibility),从而使得写出可重用及可扩展的函数库也变得困难起来。
C++同时也允许函数的重载(overload),在这种情况下,编译器通过传入的参数来进行正确的函数调用。在函数调用时所引用的实参类型必须吻合被重载的函数组(overloaded functions)中某一个函数的形参类型。重载函数与重写函数(具有多态性的函数)的不同之处在于:重载函数的调用是在编译期间就被决定了,而重写函数的调用则是在运行期间被决定的。
当一个父类被设计出来时,程序员只能猜测子类可能会重载/重写哪个函数。子类可以随时重载任何一个函数,但这种机制并不是多态。为了实现多态,设计父类的程序员必须指定一个函数为virtual,这样会告诉编译器在类的跳转表(class jump table)【译者窃以为是vtable,即虚拟函数入口表】中建立一个分发入口。于是,对于决定什么事情是由编译器自动完成,或是由其他语言的编译器自动完成这个重任就放到了程序员的肩上。这些都是从最初的C++的实现中继承下来的,而和一些特定的编译器及联结器无关。
对于重写,我们有着三种不同的选择,分别对应于:“千万别”,“可以”及“一定要”重写:
1、重写一个函数是被禁止的。子类必须使用已有的函数
2、函数可以被重写。子类可以使用已有的函数,也可以使用自己写的函数,前提是这个函数必须遵循最初的界面定义,而且实现的功能尽可能的少及完善
3、函数是一个抽象的函数。对于该函数没有提供任何的实现,每个子类都必须提供其各自的实现
父类的设计者必须要决定1和3中的函数,而子类的设计者只需要考虑2就行了。对于这些选择,程序语言必须要提供直接的语法支持。
选项1、
C++并不能禁止在子类中重写一个函数。即使是被声明为private virtual的函数也可以被重写。【Sakkinen92】中指出了即使在通过其他方法都不能访问到private virtual函数,子类也可以对其进行重写。【译者注:Sakkinen92我也没看过,但经我简单的测试,确实可以在子类中重写父类中的private virtual函数】


   本篇文章共4页,此页为首页   下一页


  引用提示:
  内容页面:C++的不足之处讨论系列一 --- C&C++语言
  作者:ItWen收集整理
  来源:www.ITWEN.com 计算机基础教程网
  

  版权申明:
  本网站所有内容,未经注明的,版权一律属于计算机基础教程网(ITWEN.com)制作署所有。转载引用本网站的原创文章,请务必注明信息来源,标明“计算机基础教程网(ITWEN.com)”字样。
  计算机基础教程网(ITWEN.com)依法保护知识产权,如果我们的文章有涉及或侵犯您的有关权益,请即时与我们联系, 注明网址及文章,我们会即时处理或删除, 感谢您的合作!   


】 【返回站点首页】【打印本页】【关闭本页
     资料搜索
     热门文章
·MPLS网络技术及其应用前景
·对Linux的文件权限的理解
·能让Windows98也拥有系统还
·Win2000在应用中的一些小技巧
·用户如何有效地利用数据字典
·delphi中的XML解析控件TX
·GuruoftheWeek条款02
·VB编程的必备技巧
·了解POP3协议,使用简单的代码监
·一个关于操作局域网的类
·如何让一个函数返回多个值C#
·长工资需要答辩----多态
·用Coreldraw制作节日贺卡4
·重温儿时的回忆用Photoshop
·Paper完CCNP之后 还“该”
     前面文章
·WIN2003下Web服务器配置1
·TTS的总结
·授权也不怎么样—MCSE认证培训亲
·hhyy安装Linux9+http
·显示和隐藏DataGrid中的列
·C++的iostream标准库介绍
·PHOTOSHOP云层中的光芒
·Windows2000实用工具四则
·浅谈Word 2003保护文档功能
·Flash MX2004入门与进阶
·如何修改treeview的背景色
·C#编程入门三部曲第二步 向表单中
·LCS问题算法VB.net版
·如何在Form中嵌入Excel
·十分钟在jb里面运行hiberna
·flash action 详解6
·用调整图层给黑白照片上色
·sqlite3数据库的性能问题报告
·局域网WEB方式实现TTS实时合成
·配置 Windows Server

文章: C++的不足之处讨论系列一 已经被浏览了 次。
免责声明 | 关于我们 | 广告联系 | 友情链接 | 帮助设置 | 网站导航 | 最近更新 | 共同合作
计算机基础教程网(www.ITwen.com) 版权所有
copyright 2005-2006,All Rights Reserved
计算机基础教程网