正在加载图片...
第六章多态性与虚函数 面向对象的封装性、继承性和多态性是OOP的三大基本支柱。本章将集中讨论类与对 象的多态性概念、设计方法和技巧,这是软件系统能否控制给定对象完成所要求各种动作的 能力问题 本章目的 理解抽象类与多态性 掌握虚函数概念和用法 掌握重载概念和用法 了解系统的编译多态性与运行多态性 多态性( polymorphism)这个词来自希腊语。是指“多形态”的意思。在某些程序设计 语言中,多态性指相同的语言结构可以代表不同类型的实体(如同一变量可以匹配各种类型 的语法结构)或者对不同类型的实体进行操作(如同一个函数可以对不同结构的表进行操 作)。在强类型语言中,多态性表现为重载( overloading)和类属( genericity),又称为参数 化多态( parameterized polymorphism)。在面向对象的概念中,多态性则是指不同对象收到 相同消息时,根据对象类不同产生不同动作。C++允许程序员发送相同消息到不同的相关对 象,而由对象决定如何完成该动作,并且支持软件选择实现决策的时间。其中运行时的多态 是面向对象的程序设计语言所独有的,有人认为,只有与动态联编相结合的多态才是真正的 面向对象的多态。在此,仍然取多态性的广泛含义,但概念重点放在运行多态上 多态性提供了把接口与实现分开的另外一个方法。多态性提高了代码的组织性和可读 性,更重要的是它使软件的可扩充性有了充分的提高,使得软件可以较容易地增加新的特性 和功能。正如在上一章讲的,可以把基类对象和不同的派生类对象在某些时候视为同一类型, 再加上动态联编,就使同一个接口可以在不同的情况下有不同的实现,而实现的增多也不会 影响到接口的形态。 6.1重载与程序设计的多态性设计 具体讲,C++支持两种多态性:编译时的多态性和运行时的多态性。编译时的多态主要 体现为函数重载以及特殊的函数重载—一运算符重载,运行时的多态则由虚函数来完成。在 分别讨论这两种多态性之前,首先要进一步搞清重载的概念和用法 6.1.1函数重载 (1)为什么要重载函数 在自然语言中,除了一词多义之外,即使是同一个动词在不同的情况下,也有细微的判 别,如洗衣服和洗车中的“洗”。这在人类语言中基本上不会引起误会。但在计算机语言中, 每个名称在计算机内部必须是唯一的标识符。如打印数就必须根据需要打印的数来定义不同 的打印函数。这种定义一方面使得程序的可读性变差,使程序员的工作变得复杂,另一方面 也没有反映不同的打印函数之间的共同点 幸运的是,C++提供了函数重载的机制,通过函数的参数数目或类型所建立的附加定义 使同一函数名在计算机内部具有不同的标识符,从而能够表现不同行为。如打印数可以表示 void print(int)第六章 多态性与虚函数 面向对象的封装性、继承性和多态性是 OOP 的三大基本支柱。本章将集中讨论类与对 象的多态性概念、设计方法和技巧,这是软件系统能否控制给定对象完成所要求各种动作的 能力问题。 本章目的: .理解抽象类与多态性 .掌握虚函数概念和用法 .掌握重载概念和用法 .了解系统的编译多态性与运行多态性 多态性(polymorphism)这个词来自希腊语。是指“多形态”的意思。在某些程序设计 语言中,多态性指相同的语言结构可以代表不同类型的实体(如同一变量可以匹配各种类型 的语法结构)或者对不同类型的实体进行操作(如同一个函数可以对不同结构的表进行操 作)。在强类型语言中,多态性表现为重载(overloading)和类属(genericity),又称为参数 化多态(parameterized polymorphism)。在面向对象的概念中,多态性则是指不同对象收到 相同消息时,根据对象类不同产生不同动作。C++允许程序员发送相同消息到不同的相关对 象,而由对象决定如何完成该动作,并且支持软件选择实现决策的时间。其中运行时的多态 是面向对象的程序设计语言所独有的,有人认为,只有与动态联编相结合的多态才是真正的 面向对象的多态。在此,仍然取多态性的广泛含义,但概念重点放在运行多态上。 多态性提供了把接口与实现分开的另外一个方法。多态性提高了代码的组织性和可读 性,更重要的是它使软件的可扩充性有了充分的提高,使得软件可以较容易地增加新的特性 和功能。正如在上一章讲的,可以把基类对象和不同的派生类对象在某些时候视为同一类型, 再加上动态联编,就使同一个接口可以在不同的情况下有不同的实现,而实现的增多也不会 影响到接口的形态。 6.1 重载与程序设计的多态性设计 具体讲,C++支持两种多态性:编译时的多态性和运行时的多态性。编译时的多态主要 体现为函数重载以及特殊的函数重载——运算符重载,运行时的多态则由虚函数来完成。在 分别讨论这两种多态性之前,首先要进一步搞清重载的概念和用法。 6.1.1 函数重载 (1)为什么要重载函数 在自然语言中,除了一词多义之外,即使是同一个动词在不同的情况下,也有细微的判 别,如洗衣服和洗车中的“洗”。这在人类语言中基本上不会引起误会。但在计算机语言中, 每个名称在计算机内部必须是唯一的标识符。如打印数就必须根据需要打印的数来定义不同 的打印函数。这种定义一方面使得程序的可读性变差,使程序员的工作变得复杂,另一方面 也没有反映不同的打印函数之间的共同点。 幸运的是,C++提供了函数重载的机制,通过函数的参数数目或类型所建立的附加定义, 使同一函数名在计算机内部具有不同的标识符,从而能够表现不同行为。如打印数可以表示 为: void print(int);
向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有