正在加载图片...
的手段,另一方面提高了软件功能和版本进化的设计维护能力。 函数重载和运算符重载函数,构成了支持C++编译多态性的表达基础。在讨论两种不同 的多态性之前,首先了解一下函数绑定( function call binding) 将函数调用与函数体连接起来叫绑定。如果绑定在程序运行之前进行(由编译器和连接 器执行),则称为预绑定( early binding),也叫静绑定。如C语言就只有预绑定。它意味着 绑定基于的信息都是静态的。而面向对象的多态性设计要求能够在运行时,根据对象类型的 不同来选择合适的函数调用,这些类型信息在编译时是不可知的。解决这一问题的绑定是后 绑定( late binding)。 例6.3a]了解预绑定的工作过程EX63a.CPP 预绑定时,编译系统根据指针(或引用)本身的类型,而不是它所指向的对象的类型来 进行绑定。 从以上的分析可见,编译时的多态的实现,取决于程序的静态信息是否足够为相同的程 序实体(指程序代码中的各种名称和代码段)确定不同的标识符。编译时的多态,表现为以 下几方面 (1)对于在一个类中说明的重载,编译系统根据重载函数的参数个数、类型以及顺序的 差别,来分别调用相应的函数。 (2)对于在基类和派生类中的重载函数,即使所带的参数完全相同,由于它们属于不同 的类,在编译时可以根据对象名前缀来加以区别:另一种方法是使用“类名::”前缀,也可 以指示编译器分辨出应该调用哪个类的成员函数 预绑定的实体包括一般函数、重载函数、非虚成员函数和非虚友元函数。调用编译时绑 定的函数,优点是高效率(因为代码优化)。缺点是缺少灵活性,不能满足程序的可扩充性 要求 6.1.5运行时的多态 运行时的多态性是在程序运行时发生的事件,编译器在编译时未确定要调用的函数,必 须根据程序运行所产生的信息来通知调用哪一个函数。这称为后绑定( late binding),是动 态联编方式。 例6.3]建立一个数组,可以处理平面图形(2 D graph)类的对象或其派生类( polygon. circle、line)的对象。这个数组可以通过如下声明实现 2D graph& g[10] 现在的要求是让数组指向的对象在屏幕上显示,即调用成员函数 drawL 如果语言支持的只有预绑定,由需要使用大量的 swicth case语句,并在代码级上进行 类型判别。实现相当麻烦。 如果能用一种简单的表达:g[draw(),而让系统去操心运行时类型的判别,使用起来 就相当方便。要做到这一点,必须有语言机制的支持一一虚函数。C++的虚函数是一种后绑 定的实体。 后绑定的主要优点是提供了程序的灵活性,主要缺点是速度较慢,效率较低。的手段,另一方面提高了软件功能和版本进化的设计维护能力。 函数重载和运算符重载函数,构成了支持 C++编译多态性的表达基础。在讨论两种不同 的多态性之前,首先了解一下函数绑定(function call binding)。 将函数调用与函数体连接起来叫绑定。如果绑定在程序运行之前进行(由编译器和连接 器执行),则称为预绑定(early binding),也叫静绑定。如 C 语言就只有预绑定。它意味着 绑定基于的信息都是静态的。而面向对象的多态性设计要求能够在运行时,根据对象类型的 不同来选择合适的函数调用,这些类型信息在编译时是不可知的。解决这一问题的绑定是后 绑定(late binding)。 [例 6.3a] 了解预绑定的工作过程 EX6_3a.CPP。 预绑定时,编译系统根据指针(或引用)本身的类型,而不是它所指向的对象的类型来 进行绑定。 从以上的分析可见,编译时的多态的实现,取决于程序的静态信息是否足够为相同的程 序实体(指程序代码中的各种名称和代码段)确定不同的标识符。编译时的多态,表现为以 下几方面: (1)对于在一个类中说明的重载,编译系统根据重载函数的参数个数、类型以及顺序的 差别,来分别调用相应的函数。 (2)对于在基类和派生类中的重载函数,即使所带的参数完全相同,由于它们属于不同 的类,在编译时可以根据对象名前缀来加以区别;另一种方法是使用“类名::”前缀,也可 以指示编译器分辨出应该调用哪个类的成员函数。 预绑定的实体包括一般函数、重载函数、非虚成员函数和非虚友元函数。调用编译时绑 定的函数,优点是高效率(因为代码优化)。缺点是缺少灵活性,不能满足程序的可扩充性 要求。 6.1.5 运行时的多态 运行时的多态性是在程序运行时发生的事件,编译器在编译时未确定要调用的函数,必 须根据程序运行所产生的信息来通知调用哪一个函数。这称为后绑定(late binding),是动 态联编方式。 [例 6.3] 建立一个数组,可以处理平面图形(2D_graph)类的对象或其派生类(polygon、 circle、line)的对象。这个数组可以通过如下声明实现: 2D_graph& g[10]; 现在的要求是让数组指向的对象在屏幕上显示,即调用成员函数 draw()。 如果语言支持的只有预绑定,由需要使用大量的 swicth_case 语句,并在代码级上进行 类型判别。实现相当麻烦。 如果能用一种简单的表达:g[i].draw(),而让系统去操心运行时类型的判别,使用起来 就相当方便。要做到这一点,必须有语言机制的支持——虚函数。C++的虚函数是一种后绑 定的实体。 后绑定的主要优点是提供了程序的灵活性,主要缺点是速度较慢,效率较低
<<向上翻页
©2008-现在 cucdc.com 高等教育资讯网 版权所有