文档详情

实验9 继承和多态练习.doc

发布:2018-04-21约2.27万字共17页下载文档
文本预览下载声明
实验9 继承和多态练习 实验目的及要求 1. 了解C++/CLI中的继承:继承的概念、派生类的定义、派生类成员的组成、成员的覆盖和标识、赋值兼容规则等等。 2. 了解C++/CLI中的多态:多态的概念、多态的实现方法、与多态有关的关键字等等,并通过对两个完整实例的研究,理解多态的含义、功能和编程方法。 实验内容及步骤 1. 有关继承和多态的知识点和例题 ⑴ 继承 继承(inheritance)是面向对象设计的重要方法和面向对象的三个重要特征(封装性、继承性和多态性)之一。从字面上说,继承就是得到父辈的遗产,在这个基础上发展自己的事业,而不必从头做起。 在类的设计中,我们会发现许多类都存在共性,一方面我们可以将这些共性抽象出来,设计成一些称为基类(或父类)的类,另一方面我们可以利用面向对象的继承机制,在基类之上设计出一些称为子类(派生类)的类,来拓展基类的功能。 现实生活中继承的例子很多。例如在自然科学中,狼、狗、狐等存在着某些共性,生物学家把它们抽象为“犬类”以描述它们的共性,然后在该大类基础上,根据每种动物的特性,再进一步细分为狼、狗、狐等子类;又例如在社会科学中,“学生”是一个基类,他们具有学号、姓名、成绩等等共性,小学生、中学生、大学生、研究生等则是子类,他们各有各的特性,可以用一组附加的属性和行为来描述。 面向对象设计的出发点之一是增强软件的可重用性,继承便是实现软件可重用性的重要途径。与之相对,面向过程方法的可重用性是靠功能模块(即函数)的重复调用来实现的,由于功能的设计与对象的属性分离,因此一旦数据(类型或数据结构)发生变化,函数便要重新设计。为了克服这一缺陷,人们想了许多办法,包括模板和泛型方法,在所有这些方法中,面向对象设计围绕着对象属性的抽象和继承具有最重要的意义。 就像自然界和人类社会的分类都是相对的一样,程序中类的层次也是相对的。一个父类可能是另一个父类的子类,一个子类之下可能还有子类,从而构成一个“树状结构”,称为“类族”,如下图所示: 人类认识事物往往有一个从特殊到一般,再从一般到特殊的过程。在面向对象设计中,我们首先将对象的共性抽象出来构成基类,其中仅包含所有派生类对象共同的属性和方法(有些方法可能需要在派生类中实现)。然后,在此基类上逐层派生,分别添加各个派生类特殊的属性和方法,并且用成员函数实现这些方法。这样,派生类继承了基类所有的属性和方法,又加入自己的属性和方法,类族便不断地完善。 以下语法定义了一个类是从另一个类派生: ref class 子类名: public 父类名 { 子类体 }; 可以看出,相对于一般类定义,它仅添加了“:public 父类名”即告诉编译系统它是从哪个类继承来的。由于C++/CLI只有公有继承(其它继承方式请参阅ANSI/ISO C++文献),故其中的关键字public可以省略,即: ref class 子类名: 父类名 { 子类体 }; 例如:ref class Circle: Shape { 属性和方法定义 }; protected: 作为与private: 和public: 平行的一种访问权限修饰符,规定某些成员只允许被本类及其派生类的成员函数所访问。它访问权限比private: 宽、比public: 窄。一个成员一旦被修饰为protected: ,则类族中从修饰它的类开始,所有子类的成员函数都可以访问它。 拥有子类的类,其属性更多地使用protected:而不是private:来封装,因为允许子类访问父类成员的可能性显然较不允许访问更大。 派生类继承了它的基类的所有的数据成员和成员函数,即派生类的成员是由基类的成员和自身的成员所组成;派生类对象所占用的内存空间,是它的基类成员所占用的内存空间与它自身成员所占用的内存空间之和。然而,全部继承并不等同于随意访问,派生类成员函数只对它的基类的公有和受保护(protected)成员有着访问的权利。 对于C++/CLI 来说,当一个派生类的构造函数被调用时,构造函数中的“初始化列表”首先被执行,然后才是基类和派生类构造函数的顺序调用。初始化列表的语法是: 派生类名(形参表): 基类名(实参表) { 函数体 } 例如: ref class Son: Father { // 子类Son从父类Father派生 private: String^ m_sname; // 子类有成员m_sname(父类有成员m_fname) public: Son(String^ sname, String^ fname): Father(fname), m_sname(sname) {} }; // 初始化列表 在创建一个类族的派生类对象时,基类构造函数的调用要先于派生类构造函数的调用。如果基类没
显示全部
相似文档