实在弄不非常懂 虚函数,纯虚函数存在的意义,我肯定没有理解,请不懂得你,懂得你随便说两句

xiaobinliu 2001-12-05 10:09:09
若是为了继承
那么普通的类(没有虚函数,纯虚函数)就可以被继承,而且工作的相当好

虚函数倒是可以理解,应该是可以通过
一个指向基类对象的指针能够依据实际的指向
来调用不同的函数,实现多态

而纯虚函数难道就是为了实现接口?接口存在的意义
我实在弄不懂,我干嘛要预先定义好?未来的事情本难料
就等有一天我的类中需要使用某个函数,在添加一个函数
不久可以?

接口真的能带来价值嘛?
...全文
3034 105 打赏 收藏 转发到动态 举报
写回复
用AI写文章
105 条回复
切换为时间正序
请发表友善的回复…
发表回复
qianwen36 2010-06-13
  • 打赏
  • 举报
回复
接口是定义一个对象的一组函数功能索引。当你要使用这个对象的的这系列功能时,你就可以通过接口指针来调用这个对象的这组函数。这就是多态的意义!

给你一个对象,但你又看不到对象的内部细节,完全不了解其有何功能时,怎么办。而恰好这时有一份关于这个对象所实现的接口功能说明,它提供的一系统功能调用规范。这不就很好的解决了,通过接口获取这对象的功能调用。此时,接口就充分发挥了虚函数实现多态的功用。

你要问为什么要多态,为什么要让基类指针去指向它的派生类。就是为了应用中的需求。可以说就算是一种编程技巧吧,它不算什么。你想想,我凭什么要让一个基类指针去指向一个子类对象啊,我定义一个对应类指针不就没事了还搞来搞去那么复杂那么神奇,呵呵,就是嘛,我一个指针了子类对象的指针要调用对象自身类的功能,没的虚函数,我转换成子类指针不就照样调用了其自身的那个函数了。

其实多态没什么意义,就是为了实现接口。什么抽象,什么封装,纯粹一些概念上的东西。玩思维啊,咱不是哲学家,还玩抽象,简直找抽!

这一切什么面向对象,对于独个人搞编程来说,没什么多大意义。但为了团队协作来说,就很重要了,就是为了工作效率。大家遵循共同的规范,编码和阅读都方便,模式呢,就成为了一条开发的成熟路径。这道路径走出来了,大家都好走,这样就出来了效率了
sunskycx 2010-06-02
  • 打赏
  • 举报
回复
很有帮助
talentbabbys 2010-06-01
  • 打赏
  • 举报
回复
大家讲的都很好,学习一下!!
xiaobinliu 2002-04-17
  • 打赏
  • 举报
回复
good!!,哈哈,加进精华贴吧,我需要信誉分,我现在97,不够100
fffjjj 2002-03-13
  • 打赏
  • 举报
回复
good!!
xiaobinliu 2001-12-20
  • 打赏
  • 举报
回复
无奈分太少,回贴太多,一下无法取舍,实乃憾事。
xiaobinliu 2001-12-19
  • 打赏
  • 举报
回复
let's go
cool2001 2001-12-19
  • 打赏
  • 举报
回复
玄痴说的很棒,为什么不给分呢,难道作者结帐时还不明白??
xiaobinliu 2001-12-17
  • 打赏
  • 举报
回复
go,let's go
xiaobinliu 2001-12-16
  • 打赏
  • 举报
回复

http://lanchatx123.yeah.net
chinahfj 2001-12-16
  • 打赏
  • 举报
回复
本人认为虚函数之精髓在与"单界面,多实现版本",可以参考楼上几位大虾举的例子.
byteboy 2001-12-12
  • 打赏
  • 举报
回复
为什么需要虚函数
在这个问题上,我们可能会问:“如果这个技术如此重要,并且能使得任何时候都能调用
‘正确’的函数。那么为什么它是可选的呢?为什么我还需要知道它呢?”
问得好。回答关系到C + +的基本哲学:“因为它不是相当高效率的”。从前面的汇编语言输
出可以看出,它并不是对于绝对地址的一个简单的C A L L,而是为设置虚函数调用需要多于两
条复杂的汇编指令。这既需要代码空间,又需要执行时间。一些面向对象的语言已经接受了这
种概念,即晚捆绑对于面向对象程序设计是性质所决定的,所以应当总是出现,它应当是不可
选的,而且用户不应当必须知道它。这是由创造语言时的设计决定,而这种特殊的方法对于许
多语言是合适的[ 1 ] 。C + +来自C传统,效率是重要的。创造C完全是为了代替汇编语言以实现
操作系统(从而改写操作系统—U n i x—使得比它的先驱更轻便)。希望有C + +的主要理由
之一是让C程序员效率更高[ 2 ]。C程序员遇到C + +时提出的第一个问题是“我将得到什么样的规
模和速度效果?”如果回答是“除了函数调用时需要有一点额外的开销外,一切皆好”,那么
许多人就会仍使用C,而不会改变到C + +。另外,内联函数是不可能的,因为虚函数必须有地
址放在V TA B L E中。所以虚函数是可选的,而且该语言的缺省是非虚拟的,这是最快的配置。
S t r o u s t r u p声明他的方针是“如果我们不用它,我们就不会为它花费”。
因此,v i r t u a l关键字可以改变程序的效率。然而,设计我们的类时,我们不应当为效率问
题而担心。如果我们想使用多态,就在每处使用虚函数。当我们试图加速我们的代码时,我们
只需寻找能让它非虚的函数(在其他方面通常有更大的好处)。
有些证据表明,进入C + +的规模和速度改进是在C的规模和速度的1 0 %之内,并且常常更
接近。能够得到更小的规模和更高速度的原因是因为C + +可以有比用C更快的方法设计程序,
而且设计的程序更小。

建立公共接口(即纯虚函数)的唯一的理由是使得它能对于每
个不同的子类有不同的表示。它建立一个基本的格
式,由此可以知道什么是对于所有派生类公共的。

以上摘自《C++编程思想》
lanchat 2001-12-12
  • 打赏
  • 举报
回复
我说个更形象的吧:如果你是个领导,你可以定义出程序的框架来,包括预留的功能(纯虚函数)就可以让手下做了:)如果你为某个公司开发的产品不足,考虑不到更细节的东西,也可以用
纯虚函数做接口,让他完善自己的那一部分,不必为类似的应用各写一遍浪费你宝贵时间的功能:)本人现在就是这样做的,呵呵
lanchat
http://lanchatx123.yeah.net
wwwxuhong 2001-12-11
  • 打赏
  • 举报
回复
预定义接口可以实现类型兼容
bbdragon 2001-12-11
  • 打赏
  • 举报
回复
其实纯虚函数的语法可能大家都知道。但是为什么存在,怎么用?

提供一种参考:应用程序框架。有人说应用程序框架区别一般类库
很重要的一点是可以调用应用程序中的函数。但是framework先有
它怎么知道你的应用程序有哪些函数可以调用呢?技巧就是使用
纯虚函数。因为如果你不重载这些纯虚函数,你是不可能生成实体的
你编译就过不了。多看看MFC源码,可以学到许多东西,例如CObject
为什么不把拷贝构造函数同operator=声明成public等。当然接口
也是纯虚函数的应用之一。
xingy 2001-12-11
  • 打赏
  • 举报
回复
在《COM技术内幕》上抄来的,可能有用:
"...(实现继承)使得一个对象的实现同另一个对象的实现紧紧的关联起来。在这种情况下,当基类的实现被修改之后,派生类将无法正常运行而必须被修改。对于一个中等规模的c++程序而言,这或许并不成问题,因为在这种情况下,我们一般能够获得所有的源代码,也能够对所有的派生类进行修改。但是对于较大的c++程序而言,对受影响的派生类进行修改所花费的时间将是相当长的。更糟的是,我们可能根本无法得到所有的源代码。这就是为什么一些用c++编写大型程序的专家们强烈建议人们基于抽象基类来构建应用程序的原因。"
EsYso 2001-12-10
  • 打赏
  • 举报
回复
虛函數的作用; 用現在的代碼調用未來的代碼 , 實現已知與未知的兼容.

说的挺有道理的.我想COM&COM+中也是如此用意.
hahaha88 2001-12-10
  • 打赏
  • 举报
回复
[。。。虛函數的作用; 用現在的代碼調用未來的代碼 , 實現已知與未知的兼容.。。。]

有道理,嘻嘻,比如在做一个container的时候,事先并不一定知道将来要放进来的类
的具体type/名字等,这时可以用抽象接口来约定,然后开发这个container,将来不管
放进来的类叫什么名字,具体的type是什么,只要它继承/实现了事先约定的抽象接口,container都可以用抽象接口的名字来称呼/标志它们,并通过override来执行这个放
进来的类中的某个虚函数/纯虚函数的实现。

这里大概有2层意思:
- 也就是说,不管放进来的类是什么,container只把放进来的这个类当做这个抽象接口来用,
从而忽略它其它的性质(虽然可能它还继承/实现了其他的东西,具有其它的性质。。。)
- 每一个放进来的类对于事先约定的抽象接口的实现都是不同的(分别用不同的方式来实现同一
个虚函数/纯虚函数),然后由container来执行这些不同的实现

大概是这样的,嘻嘻
allofeagle 2001-12-10
  • 打赏
  • 举报
回复
你可以看一下DELPHI中每一个消息处理凼数的中月乎都有一个TOBJECT.它是所有对象的基类.
lj9852 2001-12-10
  • 打赏
  • 举报
回复

这么多?做个记号先……
加载更多回复(85)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧