C 中的虚函数((((virtual function)
2008-02-23 05:29:04来源:互联网 阅读 ()
C 中的虚函数(virtual function)
C 中的虚函数(virtual function) class A class B: public A 那么,在使用的时候,我们能够: A * a = new B(); 这个例子是虚函数的一个典型应用,通过这个例子,也许您就对虚函数有了一些概念。他虚就虚在所谓“推迟联编”或“动态联编”上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。 虚函数只能借助于指针或引用来达到多态的效果,假如是下面这样的代码,则虽然是虚函数,但他不是多态的: class A class B: public A void bar() 1.1 多态 void bar(A * a) 因为foo()是个虚函数,所以在bar这个函数中,只根据这段代码,无从确定这里被调用的是A::foo()还是B::foo(),但是能够肯定的说:假如a指向的是A类的实例,则A::foo()被调用,假如a指向的是B类的实例,则B::foo()被调用。 这种同一代码能够产生不同效果的特点,被称为“多态”。 1.2 多态有什么用? 在面向对象的编程中,首先会针对数据进行抽象(确定基类)和继承(确定派生类),构成类层次。这个类层次的使用者在使用他们的时候,假如仍然在需要基类的时候写针对基类的代码,在需要派生类的时候写针对派生类的代码,就等于类层次完全暴露在使用者面前。假如这个类层次有任何的改变(增加了新类),都需要使用者“知道”(针对新类写代码)。这样就增加了类层次和其使用者之间的耦合,有人把这种情况列为程式中的“bad smell”之一。 多态能够使程式员脱离这种窘境。再回头看看1.1中的例子,bar()作为A-B这个类层次的使用者,他并不知道这个类层次中有多少个类,每个类都叫什么,但是相同能够很好的工作,当有一个C类从A类派生出来后,bar()也无需“知道”(修改)。这完全归功于多态--编译器针对虚函数产生了能够在运行时刻确定被调用函数的代码。 1.3 如何“动态联编” 我所说的“标准”方式,也就是所谓的“VTABLE”机制。编译器发现一个类中有被声明为virtual的函数,就会为其搞一个虚函数表,也就是VTABLE。VTABLE实际上是个函数指针的数组,每个虚函数占用这个数组的一个slot。一个类只有一个VTABLE,不管他有多少个实例。派生类有自己的VTABLE,但是派生类的VTABLE和基类的VTABLE有相同的函数排列顺序,同名的虚函数被放在两个数组的相同位置上。在创建类实例的时候,编译器还会在每个实例的内存布局中增加一个vptr字段,该字段指向本类的VTABLE。通过这些手段,编译器在看到一个虚函数调用的时候,就会将这个调用改写,针对1.1中的例子: void bar(A * a) 会被改写为: void bar(A * a) 因为派生类和基类的foo()函数具备相同的VTABLE索引,而他们的vptr又指向不同的VTABLE,因此通过这样的方法能够在运行时刻决定调用哪个foo()函数。 虽然实际情况远非这么简单,但是基本原理大致如此。 1.4 overload和override override是指派生类重写基类的虚函数,就象我们前面B类中重写了A类中的foo()函数。重写的函数必须有一致的参数表和返回值(C 标准允许返回值不同的情况,这个我会在“语法”部分简单介绍,但是很少编译器支持这个feature)。这个单词好象一直没有什么合适的中文词汇来对应,有人译为“覆盖”,还贴切一些。 2.1 使用virtual关键字 class A class B: public A class C: public B // 从B继承,不是从A继承! 标签: 版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 上一篇: 论C/C 函数间动态内存的传递
相关文章
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设 网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源 网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它 服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护 软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash 热门词条
最新资讯
热门关注
热门标签
|