第六章C++的类派生与虚拟函数.docVIP

  • 6
  • 0
  • 约2.88万字
  • 约 22页
  • 2016-11-30 发布于天津
  • 举报
第六章C的类派生与虚拟函数

第六章 C++的类派生与虚拟函数 第四章中已讨论的类与数据封装概念可以说是C++的第一大特征。而本章将要论述的类派生与多态概念则是C++的另外两大特征。由于有了前两章的基础,所以将这两个特征合并一章讨论也就不太困难了。 §1 C++语言所处理的类的相互关系 §1.1 包容关系的实现 一个类包含有一个以上的类作为其独立的属性成员的关系称为包容关系。被包容的类作为包容类的一个成员当然具备其成员地位应有的各种特性,但由于被包容类自身也含有成员,所以二者间又必然存在有其相互间的关联关系。 例1: #includeiostream.h #includestring.h class Course { char name[10]; int score; public: Course(){} void init(char* na, int sc) { score=sc; name[9]=\0; strncpy(name,na,9); } int getscore(){return score;} char *getname(){return name;} }; class Student { char name[10]; int number,total; Course *p; public: Student(char* na, int nu):number(nu) { int i,ccs; char cna[10]; name[9]=\0; strncpy(name,na,9); coutHow many course are the student selected:; cintotal; p=new Course[total]; coutPlease input each course name and its score:endl; for(i=0;itotal;i++) { coutThe course name:; cincna; coutthe score:; cinccs; p[i].init(cna,ccs); } } void operator!() { int i; coutThe students name is nameendlCourse name Scoreendl; for(i=0;itotal;i++) { cout p[i].getname() p[i].getscore()endl; } } }; void main() { Student s1(Wang,123); !s1; } 本例中的Student类的private区包容了一个Course类的指针。考虑到一个学生与课程的关系为1:n,所以在初始一个学生对象时临时确定该学生所选的课程数目。考察Course类会发现其内的缺省构造函数非常简单,这便是被包容类的特征。当一个类要包容另一个类的不确定数目的对象且其成员初始工作不能在一次构造函数的引用中完成时,被包容类通常都是以数组或链表等结构出现在包容类中的。此时被包容类的构造函数很难能发挥太大的作用,因此其成员初始化工作只能将内存征用和初始赋值两个步骤分开进行。前者由缺省构造函数实现,而后者自然要由其它的成员函数在以后的引用中完成了。C++语言的包容关系具有下述特征: 具有包容关系的两个类存在各自的独立性,即自身对象的存在不依赖于对方是否存在(与理论概念有区别); 被包容类对象只能以一个成员的身份被定义在包容类中,因而要受到成员所在区属性的影响; 被包容类自身的成员不会由于存在包容关系而成为包容类成员; §1.2类模板 在客观模型中的类内的成员数据和成员函数的参数或返回值类型也有不能确定类型的情形。此时可应用类模板来取代这些未知的成分,待到运行时再动态地装入具体的类型。类模板的声明的语法格式如下: templateclass 替代类型标识符 与函数模板相同的格式要求,类模板的声明的语句也必须置于类声明的前面。如有两个以上的模板参数时,应使用逗号分隔。使用含类模板的类定义对象时也必须在类名的后面带上“实际类型”的参数形式。类模板最常用于各种类包容关系的设计模型之中。 例2: #includeiostream.h templateclass T class A

文档评论(0)

1亿VIP精品文档

相关文档