正在加载图片...
第8单元类与对象(I) 157 该函数都保持 virtual特性。因此,在派生类中重新定义该函数时,不再需要关键字 virtual 但习惯上,为了提高程序的可读性,常在每层派生类中都重复地使用 virtual关键字。在运 行时,不同类对象调用的是各自的虚函数,这就是运行时的多态性。 使用虚函数时应注意 1.在派生类中重新定义虚函数时,必须保证该函数的值和参数与基类中的声明完全 致,否则就属于重载(参数不同)或是一个错误(仅返回值不同) 2.如果在派生类中没有重新定义虚函数,则该类的对象将使用其基类中的虚函数代码 3.析构函数可以是虚函数,但构造函数则不得是虚函数。一般地讲,若某类中定义有 虚函数,则其析构函数也应当声明为虚函数特别是在析构函数需要完成一些有意义的操作, 比如释放内存时,尤其应当如此 在编写面向对象的程序时,并非必须使用虚函数。然而,利用虚函数可使所设计的软件 系统变得灵活,提高了代码的可重用性。同时,虚函数为一个类体系中所有子类的同一行为 提供了统一的接口,这就使得程序员在使用一个类体系时只须记往一个接口即可。这种接口 与实现分离的机制也提供了对类库(如MFC)的支持。如果能正确地实现这些类库,则它 们将操作一个公共的接口,可以用来派生自己的类以满足特定的需要。正因为如此,有时在 声明一个基类时无法为虚函数定义其具体实现,这时仍可以将其声明为纯虚函数,其具体实 现留给派生类来定义。纯虚函数的声明方法为: virtual<返回值类型><函数名>(<参数表>)=0 纯虚函数是构成抽象类的因素之一,包含有纯虚函数的类为抽象类 83运算符重载 在C++中,运算符和函数一样,也可以重载。重载运算符主要用于对类的对象的操作 与函数的重载和虚函数一样,运算符重载也从一个方面体现了OOP技术的多态性 重载一个运算符,必须定义该运算符的具体操作。为了使程序员能像定义函数的具体操 作一样来重载一个运算符,C+提供了 operator函数。该函数的一般形式为 类型〉<类名>: operator<操作符>(<参数表》) 其中<类型>为函数的返回值,也就是运算符的运算结果值的类型:<类名>为该运算符重载 所属类的类名;而<运算符>即所重载的运算符,可以是C++中除了“:”、“ (访 问指针内容的运算符,与该运算符同形的指针说明运算符和乘法运算符允许重载)”和“?” 以外的所有运算符。 [例8-2]声明一个复数类,并重载加法和赋值运算符以适应对复数运算的要求 程序 / Example8-2:复数类第 8 单元 类与对象(II) - 157 - 该函数都保持 virtual 特性。因此,在派生类中重新定义该函数时,不再需要关键字 virtual。 但习惯上,为了提高程序的可读性,常在每层派生类中都重复地使用 virtual 关键字。在运 行时,不同类对象调用的是各自的虚函数,这就是运行时的多态性。 使用虚函数时应注意: 1.在派生类中重新定义虚函数时,必须保证该函数的值和参数与基类中的声明完全一 致,否则就属于重载(参数不同)或是一个错误(仅返回值不同); 2.如果在派生类中没有重新定义虚函数,则该类的对象将使用其基类中的虚函数代码; 3.析构函数可以是虚函数,但构造函数则不得是虚函数。一般地讲,若某类中定义有 虚函数,则其析构函数也应当声明为虚函数。特别是在析构函数需要完成一些有意义的操作, 比如释放内存时,尤其应当如此。 在编写面向对象的程序时,并非必须使用虚函数。然而,利用虚函数可使所设计的软件 系统变得灵活,提高了代码的可重用性。同时,虚函数为一个类体系中所有子类的同一行为 提供了统一的接口,这就使得程序员在使用一个类体系时只须记往一个接口即可。这种接口 与实现分离的机制也提供了对类库(如 MFC)的支持。如果能正确地实现这些类库,则它 们将操作一个公共的接口,可以用来派生自己的类以满足特定的需要。正因为如此,有时在 声明一个基类时无法为虚函数定义其具体实现,这时仍可以将其声明为纯虚函数,其具体实 现留给派生类来定义。纯虚函数的声明方法为: virtual <返回值类型> <函数名> (<参数表>)= 0; 纯虚函数是构成抽象类的因素之一,包含有纯虚函数的类为抽象类。 8.3 运算符重载 在 C++中,运算符和函数一样,也可以重载。重载运算符主要用于对类的对象的操作。 与函数的重载和虚函数一样,运算符重载也从一个方面体现了 OOP 技术的多态性。 重载一个运算符,必须定义该运算符的具体操作。为了使程序员能像定义函数的具体操 作一样来重载一个运算符,C++提供了 operator 函数。该函数的一般形式为: <类型> <类名>::operator <操作符>(<参数表>) { ... ... } 其中<类型>为函数的返回值,也就是运算符的运算结果值的类型;<类名>为该运算符重载 所属类的类名;而<运算符>即所重载的运算符,可以是 C++中除了“::”、“.”、“*(访 问指针内容的运算符,与该运算符同形的指针说明运算符和乘法运算符允许重载)”和“?:” 以外的所有运算符。 [例 8-2] 声明一个复数类,并重载加法和赋值运算符以适应对复数运算的要求。 程 序: // Example 8-2: 复数类
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有