首页考试吧论坛Exam8视线考试商城网络课程模拟考试考友录实用文档求职招聘论文下载
2014中考
法律硕士
2014高考
MBA考试
2014考研
MPA考试
在职研
中科院
考研培训 自学考试 成人高考
四 六 级
GRE考试
攻硕英语
零起点日语
职称英语
口译笔译
申硕英语
零起点韩语
商务英语
日语等级
GMAT考试
公共英语
职称日语
新概念英语
专四专八
博思考试
零起点英语
托福考试
托业考试
零起点法语
雅思考试
成人英语三级
零起点德语
等级考试
华为认证
水平考试
Java认证
职称计算机 微软认证 思科认证 Oracle认证 Linux认证
公 务 员
导游考试
物 流 师
出版资格
单 证 员
报 关 员
外 销 员
价格鉴证
网络编辑
驾 驶 员
报检员
法律顾问
管理咨询
企业培训
社会工作者
银行从业
教师资格
营养师
保险从业
普 通 话
证券从业
跟 单 员
秘书资格
电子商务
期货考试
国际商务
心理咨询
营 销 师
司法考试
国际货运代理人
人力资源管理师
广告师职业水平
卫生资格 执业医师 执业药师 执业护士
会计从业资格
基金从业资格
统计从业资格
经济师
精算师
统计师
会计职称
法律顾问
ACCA考试
注册会计师
资产评估师
审计师考试
高级会计师
注册税务师
国际内审师
理财规划师
美国注册会计师
一级建造师
安全工程师
设备监理师
公路监理师
公路造价师
二级建造师
招标师考试
物业管理师
电气工程师
建筑师考试
造价工程师
注册测绘师
质量工程师
岩土工程师
造价员考试
注册计量师
环保工程师
化工工程师
咨询工程师
结构工程师
城市规划师
材料员考试
监理工程师
房地产估价
土地估价师
安全评价师
房地产经纪人
投资项目管理师
环境影响评价师
土地登记代理人
缤纷校园 实用文档 英语学习 作文大全 求职招聘 论文下载 访谈|游戏
计算机等级考试
您现在的位置: 考试吧 > 计算机等级考试 > 计算机二级考试 > C加加 > 复习资料 > 正文

2014年计算机二级C++考点归纳:继承与派生

  7.4 子类型关系

  公有继承时,派生类的对象可以作为基类的对象处理,派生类是基类的子类型。

  子类型关系使得在需要基类对象的任何地方都可以使用公有派生类的对象来替代,从而可以使用相同的函数统一处理基类对象和公有派生类对象(形参为基类对象时,实参可以是派生类对象),而不必为每一个类设计单独的处理程序,大大提高了程序的效率。它是实现多态性的重要基础之一。

  子类型关系的定义如下:

  有一个特定的类型S,当且仅当它提供了类型T的行为时,称类型S是类型T的子类型。

  公有派生类的对象可以赋值给基类的对象。实际上不仅如此,具有子类型关系的基类和派生类的对象之间满足如下赋值兼容规则:

  (1)公有派生类的对象可以赋值给基类的对象,即用公有派生类对象中从基类继承来的成员,逐个赋值给基类对象的成员。

  (2)公有派生类的对象可以初始化基类的引用。

  (3)公有派生类的对象的地址可以赋值给指向基类的指针。

  7.5 虚函数与多态性

  1多态性的概念

  一个面向对象的系统常常要求一组具有相同基本语义的方法能在同一接口下为不同的对象服务,这就是所谓多态性(polymorphism)。

  在C+ +语言中,多态性可分为两类:编译时的多态性和运行时的多态性。

  编译时的多态性是通过函数重载和模板体现的。利用函数重载机制,在调用同名的函数时,编译系统可根据实参的具体情况确定所调用的是同名函数中的哪一个。利用函数模板,编译系统可根据模板实参以及模板函数实参的具体情况确定所要调用的是哪个函数,并生成相应的函数实例;利用类模板,编译系统可根据模板实参的具体情况确定所要定义的是哪个类的对象,并生成相应的类实例。由于有关操作所针对的具体目标(函数或类)的确定都是在编译时完成的,与运行时的动态环境无关,“编译时的多态性”因此而得名,其实现机制则和为静态绑定(static binding,也译作静态联编)。函数重载是“函数”一章中已经学习过的内容,但其中没有包含函数重载的一种特殊情况:运算符重载。

  2虚函数

  在成员函数声明的前面加上virtual修饰,即把该函数声明为虚函数。虚函数可以是另一个类的友元函数,但不得是静态成员函数。

  在派生类中可以重新定义从基类继承下来的虚函数,从而提供该函数的适用于派生类的专门版本。也可能并不需要重新定义,在这种情况下,继承下来的虚函数仍然保持其在基类中的定义,即派生类和基类使用同一函数版本。除少数特殊情况外,在派生类中重定义虚函数时,函数名、形参表和返回值类型必须保持不变。

  虚函数在派生类被重定义后,重定义的函数仍然是一个虚函数,可以在其派生类中再次被重定义。注意,对于虚函数的重定义函数,无论是否用virtual修饰都是虚函数。当然,最好不要省略virtual修饰,以免削弱程序的可读性。

  对虚函数的调用有两种方式:非多态调用和多态调用。非多态调用是指不借助于指针或引用的直接调用。非多态调用总是通过成员访问运算符 .进行的。与通常的成员函数调用类似,非多态调用是建立在静态绑定机制的基础之上的,不具备多态性特征。多态调用是指借助于指向基类的指针或引用的调用。在C+ +中,一个基类指针(或引用)可以用于指向它的派生类对象,而且通过这样的指针(或引用)调用虚函数时,被调用的是该指针(或引用)实际所指向的对象类的那个重定义版本。

  基类中的实函数也可以在派生类中重定义,但重定义的函数仍然是实函数。在实函数的情况下,通过基类指针(或引用)所调用的只能是基类的那个函数版本,无法调用到派生类中的重定义函数。也就是说,尽管调用的语法形式可能是相同的,但对实函数的任何形式的调用都是非多态的。注意,无论是虚函数还是实函数,在派生类中被重定义后,原来的函数版本即被隐藏,在通过成员访问运算符 .直接调用该函数时,所调用的是重定义版本。但原来的版本依然存在,仍然可以通过在函数名前加域修饰(即:<类名>::)来调用它们。

  3虚析构函数

  析构函数也可以通过virtual修饰而声明为虚函数。虚析构函数与一般虚函数的不同之处在于:

  (1)重定义函数就是派生类的析构函数,不要求同名。

  (2)一个虚析构函数的版本被调用执行后,接着就要调用执行基类版本,依次类推,直到调用执行了派生序列的最开始的那个虚析构函数版本为止。

  通常,只要派生类中包含有虚函数的重定义(从而有可能被多态调用),而且对析函数进行了专门的声明(而不是不做任何声明,从而采用默认的析构函数),其基类的析构函数就应当声明为虚函数,否则就可能出问题。

  4纯虚函数与抽象类

  在某些情况下,基类无法确定(或无法完全确定)一个虚函数的具体操作方式或内容,只能靠派生类来提供各个具体的实现版本。基类中的这种必须靠派生类提供重定义版本的虚函数称为纯虚函数。为了将一个虚函数声明为纯虚函数,需要在虚函数原形的语句结束符 ;之前加上=0。

  拥有纯虚函数的类称为抽象类,抽象类不能用来定义对象。如果一抽象类的派生类没有重定义来自基类的某个纯虚函数,则该函数在派生类中仍然是纯虚函数,这就使得该派生类也成为抽象类。也就是说,一个派生类可以把重定义纯虚函数的任务进一步转交给它自己的派生类。

  可以在将一个函数声明为纯虚函数的同时,为该函数提供实现版本。换句话说,一个函数是否为纯虚函数,取决于其原形的尾部是否为“=0”,与实现版本的有无没有什么关系。拥有实现版本的纯虚函数仍然有赖于派生类提供重定义版本。纯虚函数的实现版本通常是不完善的版本,但包含了一些共有操作,供各个派生类在重定义函数中调用。派生类在重定义一个纯虚函数时,可以继续将之声明为纯虚函数。另外,纯虚函数不得声明为内联函数。

 

 

 

上一页  1 2 3 4 5  下一页

编辑推荐:

2014年上半年计算机等级考试报名时间预告

2014年计算机等级考试考试时间预测

2013年9月计算机等级考试成绩查询时间及方式预告

文章责编:wuchong  
看了本文的网友还看了
文章搜索
版权声明:如果计算机等级考试网所转载内容不慎侵犯了您的权益,请与我们联系800@exam8.com,我们将会及时处理。如转载本计算机等级考试网内容,请注明出处。