首页 > 知识点讲解
       继承与多态
知识路径: > 嵌入式系统软件基础知识 > 嵌入式系统程序设计 > 嵌入式程序设计语言 > 嵌入式C/C++程序设计要求 > C++程序设计基础 > 
相关知识点:28个      
        代码复用是面向对象技术中最重要的特点之一,它是通过类继承机制来实现的。
               继承
               通过类继承,在程序中可以复用基类的代码,并可以在继承类中增加新代码或者覆盖被继承类(基类)的成员函数,为基类成员函数赋予新的意义,实现最大限度的代码复用。
               继承的一般形式如下:
               
               访问权限是访问控制说明符,它可以是public、private或protected。
               派生类与基类是有一定联系的,基类描述一个事物的一般特征,而派生类有比基类更丰富的属性和行为。如果需要,派生类可以从多个基类继承,也就是多重继承。通过继承,派生类自动得到了除基类私有成员以外的其他所有数据成员和成员函数,在派生类中可以直接访问,从而实现了代码的复用。
               派生类对象生成时,要调用构造函数进行初始化,其过程是:先调用基类的构造函数,对派生类中的基类数据进行初始化,然后再调用派生类自己的构造函数,对派生类的数据进行初始化工作。当然,在派生类中也可以更改基类的数据,只要它有访问权限。基类数据的初始化要通过基类的构造函数,而且它要在派生类数据之前初始化,所以基类构造函数在派生类构造函数的初始化表中调用。
               
               其中,“参数表1”是派生类构造函数的参数,“参数表2”是基类构造函数的参数。通常情况下,参数表2中的参数是参数表1的一部分。也就是说,用户应该提供给派生类所有需要的参数,包括派生类和基类。如果派生类构造函数没有显式调用基类的构造函数,编译器也会先调用基类的默认参数的构造函数。如果派生类自己也没有显式定义构造函数,那么编译器会为派生类定义一个默认的构造函数,在生成派生类对象时,仍然先调用基类的构造函数。
               析构函数在对象被销毁时调用,对于派生类对象来说,基类的析构函数和派生类的析构函数也要分别调用,不过不需要进行显式的析构函数调用。析构函数调用次序与构造函数调用次序正好相反。
               访问说明符public、private或protected控制数据成员和成员函数在类内和类外如何访问。当一个类的成员定义为public,就能够在类外访问,包括它的派生类;当一个成员定义为private,它仅能在类内访问,不能被它的派生类访问。当一个成员定义为protected,它能在类内和其派生类内被访问。当一个成员没有指定访问说明符时,默认为private。在定义派生类时,访问说明符也能出现在基类的前面,它控制基类的数据成员和成员函数在派生类中的访问方法。当访问说明符为public时,基类的公有成员变为派生类的公有成员,基类的保护成员变为派生类的保护成员;当访问说明符为protected时,基类的公有和保护成员均变为派生类的保护成员;而当访问说明符为private时,基类的公有和保护成员均变为派生类的私有成员。
               多态
               面向对象程序设计的核心是多态性(polymorphism),简单来说就是“一个接口,多种方法”,程序在运行时才决定所调用的函数。
               在派生类中可以定义一个与基类同名的函数,也就是说为基类的成员函数提供了一个新的定义,在派生类中的定义与在基类中的定义有完全相同的方法签名(即参数个数与类型均相同)和返回类型,对于普通成员函数,这称为重置(或覆盖);而对于虚成员函数,则称之为实现。
               多态也称为动态绑定或迟后绑定,因为到底调用哪一个函数,在编译时不能确定,而要推迟到运行时确定。也就是说,要等到程序运行时,确定了指针所指向的对象的类型时才能够确定。
               函数调用是通过相应的函数名来实现的。将源程序进行编译后并加载到内存执行时,函数实际上是一段机器代码,它是通过首地址进行标识和调用的。在C++中,函数调用在程序运行之前就已经和函数体(函数的首地址)联系起来。编译器把函数体翻译成机器代码,并记录了函数的首地址。在对函数调用的源程序段进行编译时,编译器知道这个函数名的首地址在哪里(它可以从生成的标识符表中查到这个函数名对应的首地址),然后将这个首地址替换为函数名,一并翻译成机器码。这种编译方法称为早期绑定或静态绑定。
               当用基类指针调用成员函数时,是调用基类的成员函数还是调用派生类的成员函数,这由指针指向的对象的类型决定。也就是说,如果基类指针指向基类对象,就调用基类的成员函数;如果基类指针指向派生类对象,就调用派生类的成员函数。这就要用到另外一种方法,称为动态绑定或迟后绑定。
               在C++中,动态绑定是通过虚函数来实现的。虚函数的定义很简单,只要在成员函数原型前加一个关键字virtual即可。如果一个基类的成员函数定义为虚函数,那么它在所有派生类中也保持为虚函数,即使在派生类中省略了virtual关键字。要达到动态绑定的效果,基类和派生类的对应函数不仅名字相同,而且返回类型、参数个数和类型也必须相同。
               仅定义了函数而没有函数实现的虚函数称之为纯虚函数。定义纯虚函数的方法是在虚函数参数表右边的括号后加一个“=0”的后缀,例如:
               
               含有纯虚函数的类,称之为抽象类。C++不允许用抽象类创造对象,它只能被其他类继承。要定义抽象类,就必须定义纯虚函数,它实际上起到一个接口的作用。
               对虚函数的限制是:只有类的成员函数才可以是虚函数;静态成员函数不能是虚函数;构造函数不能是虚函数,析构函数可以是虚函数,而且常常将析构函数定义为虚函数。
 
 相关知识点:
 
软考在线指南
优惠劵及余额
在线支付
修改密码
下载及使用
购买流程
取消订单
联系我们
关于我们
联系我们
商务合作
旗下网站群
高级资格科目
信息系统项目管理师 系统分析师
系统架构设计师 网络规划设计师
系统规划与管理师
初级资格科目
程序员 网络管理员
信息处理技术员 信息系统运行管理员
中级资格科目
系统集成项目管理工程师 网络工程师
软件设计师 信息系统监理师
信息系统管理工程师 数据库系统工程师
多媒体应用设计师 软件评测师
嵌入式系统设计师 电子商务设计师
信息安全工程师
 

本网站所有产品设计(包括造型,颜色,图案,观感,文字,产品,内容),功能及其展示形式,均已受版权或产权保护。
任何公司及个人不得以任何方式复制部分或全部,违者将依法追究责任,特此声明。
本站部分内容来自互联网或由会员上传,版权归原作者所有。如有问题,请及时联系我们。


工作时间:9:00-20:00

客服

点击这里给我发消息 点击这里给我发消息 点击这里给我发消息

商务合作

点击这里给我发消息

客服邮箱service@rkpass.cn


京B2-20210865 | 京ICP备2020040059号-5 |京公网安备 11010502032051号 | 营业执照 | Copyright ©2000-2023 All Rights Reserved 软考在线版权所有