通行证: 用户 密码
http://www.pconline.cn/
汽车网 | 游戏网 | 时尚女性
分站:北京 上海 广州 深圳 香港
广西 重庆 山东 江苏 辽宁 福建
首 页 | 今日报价 | 产业资讯 | 数码世界 | 硬件资讯 | 软件资讯 | 下 载 | 游 戏 |
论 坛 | 产 品 库 | 渠道商情 | 招聘培训 | 二    手 | 评 测 室 | 导 购 | 社 区 |
摄影
部落
手 机
数码相机
随身听
 DIY配件
笔记本
 台式机
摄像机
精品廊
-
您现在的位置:软件资讯 > 开发特区 > 开发语言 > C/C++
  C++中的虚函数(virtual function) 出处:c++社区
[ 2005-07-15 10:35:52 ] 作者:unknow 责任编辑:moningfeng

一.简介

   虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。假设我们有下面的类层次:

class A
{
public:
virtual void foo() { cout << "A::foo() is called" << endl;}
};

class B: public A
{
public:
virtual void foo() { cout << "B::foo() is called" << endl;}
};


  那么,在使用的时候,我们可以:

A * a = new B();
a->foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的!


  这个例子是虚函数的一个典型应用,通过这个例子,也许你就对虚函数有了一些概念。它虚就虚在所谓“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。

  虚函数只能借助于指针或者引用来达到多态的效果,如果是下面这样的代码,则虽然是虚函数,但它不是多态的:

class A
{
public:
virtual void foo();
};

class B: public A
{
virtual void foo();
};

void bar()
{
A a;
a.foo(); // A::foo()被调用
}



1.1 多态
  在了解了虚函数的意思之后,再考虑什么是多态就很容易了。仍然针对上面的类层次,但是使用的方法变的复杂了一些:

void bar(A * a)
{
a->foo(); // 被调用的是A::foo() 还是B::foo()?
}


  因为foo()是个虚函数,所以在bar这个函数中,只根据这段代码,无从确定这里被调用的是A::foo()还是B::foo(),但是可以肯定的说:如果a指向的是A类的实例,则A::foo()被调用,如果a指向的是B类的实例,则B::foo()被调用。

  这种同一代码可以产生不同效果的特点,被称为“多态”。

1.2 多态有什么用?
  多态这么神奇,但是能用来做什么呢?这个命题我难以用一两句话概括,一般的C++教程(或者其它面向对象语言的教程)都用一个画图的例子来展示多态的用途,我就不再重复这个例子了,如果你不知道这个例子,随便找本书应该都有介绍。我试图从一个抽象的角度描述一下,回头再结合那个画图的例子,也许你就更容易理解。

  在面向对象的编程中,首先会针对数据进行抽象(确定基类)和继承(确定派生类),构成类层次。这个类层次的使用者在使用它们的时候,如果仍然在需要基类的时候写针对基类的代码,在需要派生类的时候写针对派生类的代码,就等于类层次完全暴露在使用者面前。如果这个类层次有任何的改变(增加了新类),都需要使用者“知道”(针对新类写代码)。这样就增加了类层次与其使用者之间的耦合,有人把这种情况列为程序中的“bad smell”之一。

  多态可以使程序员脱离这种窘境。再回头看看1.1中的例子,bar()作为A-B这个类层次的使用者,它并不知道这个类层次中有多少个类,每个类都叫什么,但是一样可以很好的工作,当有一个C类从A类派生出来后,bar()也不需要“知道”(修改)。这完全归功于多态--编译器针对虚函数产生了可以在运行时刻确定被调用函数的代码。

天敏贴纸相框设计大赛,千元大奖等你拿!

[1] [2] [3] [4] [下一页]

正在加载评论,请稍候…

发给好友 我要报错 投稿给我们 加入收藏 返回顶部

本栏今日更新
相关文章
·代码Kahuna,微软测试新版HotMAIL
·再泄漏!Longhorn Beta1初定7月27日
·快更新!微软7月份安全公告发布
·Longhorn效仿Unix安全性?
·小块头大智慧:微软IE网络霸业十年回眸
·如何屏蔽eMule中指定的服务器
·表情[卡通]:来!给我亲一个
·C++中的虚函数(virtual function)
·CRichEditCtrl实现MSN/QQ动画表情
·Windows API-GDI入门基础知识详解(3)
·Windows API-GDI入门基础知识详解(2)
·Windows API-GDI入门基础知识详解(1)
·Visual C++ 入门精解
·C++通过WIN32 API获取逻辑磁盘详细信息
·运行中程序删除自己的方法
·C#中简单调用c/c++旧模块

完美时尚娱乐:2004年腾讯QQ评测大观
精彩无限:MSN Shell4使用指南
亲手制作鲜花情人贺卡送给她
挑战伏明霞?企鹅跳水游戏,看你能得多少分?

新闻搜索
高级搜索
Flash排行榜
·头文字D主题曲-漂移
·无情的你!六月的雨
·冒险游戏-小破孩奔月
·南京话说唱!喝馄饨
·斗实力斗技术!篮球斗牛
·《童话》励志鼓励篇
·好玩!超级连连看
·惊险刺激!忍者之死
·搞笑好玩!倒霉机器人
·冒险游戏-金碟神偷
热点专题
·向"流氓软件"大声说不!
·电脑艺术设计大师之路连载
·老歌歪唱Flash MV爆笑欣赏
·2005年XP SP2全新技巧放送
·视频轻松学Dreamweaver教程
·瞩目!QQ2005 Beta1火热发布
·全面了解FireFox浏览器
·情人节感动MM的十首MV
·QQ辅助软件使用指南
·含泪惜别!毕业十大必唱歌曲
·想不到?常用软件的另类用法
·搜索技巧:网罗天下的乐趣
IT培训十大热门文章
-