网站大量收购独家精品文档,联系QQ:2885784924

[C++中虚函数的作用.doc

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[C中虚函数的作用

C++中虚函数的作用(多态的原理) 2009-04-17 22:02■ 如果你期望衍生类别重新定义一个成员函数,那么你应该在基础类别中把此函数设为virtual。 ■ 以单一指令唤起不同函数,这种性质称为Polymorphism,意思是the ability toassume many forms,也就是多态。 ■ 虚拟函数是C++ 语言的Polymorphism 性质以及动态绑定的关键。 ■ 既然抽象类别中的虚拟函数不打算被调用,我们就不应该定义它,应该把它设为纯虚拟函数(在函数声明之后加上=0 即可)。 ■ 我们可以说,拥有纯虚拟函数者为抽象类别(abstract Class),以别于所谓的具象类别(concrete class)。 ■ 抽象类别不能产生出对象实体,但是我们可以拥有指向抽象类别之指针,以便于操作抽象类别的各个衍生类别。 ■ 虚拟函数衍生下去仍为虚拟函数,而且可以省略virtual 关键词。 虚函数联系到多态,多态联系到继承.所以本文中都是在继承层次上做文章.没了继承,什么都没得谈. 下面是对C++的虚函数这玩意儿的理解. 一.什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你就应该从这里开始) 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略.下面来看一段简单的代码: class A{ public: void print(){ coutThis is Aendl;} }; class B: public A{ public: void print(){ coutThis is Bendl;} }; int main() //为了在以后便于区分,我这段main()代码叫做main1 { A a; B b; a.print(); b.print(); } 通过class A和class B的print()这个接口,可以看出这两个class因个体的差异而采用了不同的策略,输出的结果也是我们预料中的,分别是This is A和This is B.但这是否真正做到了多态性呢? No,多态还有个关键之处就是一切用指向基类的指针或引用来操作对象.那现在就把main()处的代码改一改. int main() //main2 { A a; B b; A* p1=a; A* p2=b; p1-print(); p2-print(); } 运行一下看看结果,哟呵,蓦然回首,结果却是两个This is A.问题来了,p2明明指向的是class B的对象但却是调用的class A的print()函数,这不是我们所期望的结果,那么解决这个问题就需要用到虚函数. class A{ public: virtual void print(){ coutThis is Aendl;} //现在成了虚函数了 }; class B: public A{ public: void print(){ coutThis is Bendl;} //这里需要在前面加上关键字virtual吗? }; 毫无疑问,class A的成员函数print()已经成了虚函数,那么class B的print()成了虚函数了吗?回答是Yes,我们只需在把基类的成员函数设为virtual,其派生类的相应的函数也会自动变为虚函数.所以,class B的print()也成了虚函数.那么对于在派生类的相应函数前是否需要用virtual关键字修饰,那就是你自己的问题了. 现在重新运行main2的代码,这样输出的结果就是This is A和This is B了. 现在来消化一下,我作个简单的总结,指向基类的指针在操作它的多态类对象时,会根据不同的类对象,调用其相应的函数,这个函数就是虚函数. 二.虚函数是如何做到的(如果你没有看过《Inside The C++ Object Model》这本书,但又急切想知道,那你就应该从这里开始.) 虚函数是如何做到因对象的不同而调用其相应的函数的呢?现在我们就来剖析虚函数.我们先定义两个类: class A{ //虚函数示例代码 public: virtual void fun(){cout1endl;} virtual void fun2(){cout2endl;} }; class B: public A{ public: void fun(){cout3endl;} void fun2(){cout4endl;} }; 由于这两个类中有虚函数存在,所以编译器就会为他们两个分别插入一段你不知道的数据,并为他们分别创建一个表.那段数

您可能关注的文档

文档评论(0)

huhongjun + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档