新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 类的封装与继承

类的封装与继承

作者:时间:2009-12-14来源:网络收藏


1 从过程到对象――类概念的引入
真实世界是由“对象”组成的,无论是动物、植物、工厂还是机器等,都是根据它们的特征,细分出来的对象类别。尽管在软件设计时,更多时候我们面对的是经过高度抽象化的模型,但最终需要解决的还是真实世界中的问题。因此,如果能够在软件设计中按照对象来进行建模,将更加契合真实世界的情况,有利于解决高度复杂的实际问题。典型的过程化程序设计语言,如,其程序设计更倾向于面向过程,以函数为基本单位。这在自顶向下设计方法深入人心的今天,往往有些力不从心,因为它很难恰如其分地模拟真实世界。
对于C++语言来说,设计的基本单位是类。类是逻辑上相关的函数与数据的封装,它是对所要处理的问题的抽象描述。引入了类概念的面向对象程序设计语言C++具有更高的代码集成度,从而更适合用于大型复杂程序的开发。而由类产生的基类、、派生、模板等概念,更是极大地丰富了软件工程师解决问题的手段。如此强大的概念,如若使用不当,必然带来许多意想不到的隐患。为此MISRA C++:2008中专门讨论了与类使用相关的问题,简单举例如下。
规则10-1-3(强制): 同一层级的某个基类不允许既是虚基类又是非虚基类。
这是因为,如果一个基类在多重层次中既是虚类型,又是非虚类型,则在派生出来的相应对象中将至少有2个该基类的子对象拷贝。这可能与开发人员的理解不一致。为了更好说明这个问题,请看下面的程序:

本文引用地址:http://www.eepw.com.cn/article/173524.htm


上述程序中,由于B1、B2是对A的public virtual,而B3是对A的public继承。因此,对于C而言,将保有A的2个子对象拷贝,造成不必要的冗繁,并隐含造成开发人员误解的危险因素。所以,虽然这段程序在语法上是没有错误的,但是出于程序安全性角度的考虑,这种使用方法被MISRA C++:2008所禁止。
我们知道,通过将数据(属性)和函数(行为)封装在称为对象的包中,可以实现数据和函数的紧密联系,构成对象对信息的隐藏性。这样,尽管对象知道怎样通过定义好的接口实现相互的通信,但是对象通常并不知道其他对象是怎样实现的,对象的细节隐藏在对象的内部。而同一类对象则具有相同的特点,新建立的对象通过继承现有类的特征而派生出来,同时可以包含各自独有的特点。
也就是说,“类”很好地解决了2个问题:程序模块化封装的实现,以及合理提高代码的利用率。对于软件设计者之外的用户而言,每一个对象都是给出了特定接口的“黑盒子”;而对于特定的数据结构,经过单一定义之后,就可以借用继承主体、修改细节的手段,来实现重复利用。如此高效的统筹兼顾,源于“类”这个崭新概念的引入。然而这种高效也需要严格的规范来保证,否则会带来意想不到的隐患。为此MISRA C++:2008从类、派生类、成员访问的控制、特殊的成员函数以及模板这几个方面进行了详细的讨论,并出于安全角度考虑,提出了一系列规则。下面就结合MISRA C++:2008中的相关规则,对这2个问题作进一步阐述。


2 统――数据与代码的封装
对象的独立性是通过封装实现的,这是指将抽象得到的数据成员和代码成员相结合,形成一个统一的有机整体,也就是说,将数据与操作数据的行为进行有机的结合、统一。
通过封装,一部分成员作为类与外部的接口,其他成员则被很好地隐蔽起来,以实现对数据访问权限的合理控制,使程序中不同部分之间的相互影响减小到最低。这样可以达到增强安全性和简化程序编写工作的目的。但是在进行封装时,疏忽一些细节可能会得到与程序设计者初衷相去甚远的结果,看下面的例子。
规则9-3-1(强制): 常量类型的成员函数不允许返回非常量类型的指针或对类数据的引用。
当对象被声明为常量型的类时,只有该类的常量成员函数能被人们调用。当调用常量成员函数时,人们一般认为将不会改变对象的状态。然而,当常量类型的函数返回1个指向类数据的非常量指针或者对类数据的引用时,理论上将允许改变对象的状态。这是程序设计者不希望看到的。
作为保护数据、实现模块化编程的手段,一个完全无法被外部访问的“封装”是没有意义的。因此在利用封装来限制对对象的修改操作时,必须留出必要的“接口”。这些接口通常必须以对象的成员函数的形式给出,否则可能会破坏封装的效果。再看下面的例子。
规则9-3-2(强制): 成员函数不允许返回对于类数据的非常量的旬柄。
利用类的成员函数构建类的访问接口时,可以就对象状态是如何被修改的保留更多的控制能力,同时可以实现在对类进行维护时不会受到用户的影响。返回类数据的句柄,将使得用户可以不经过类的接口而对类的状态进行修改,从而破坏了封装。


上一页 1 2 3 下一页

关键词: 继承 C语言

评论


相关推荐

技术专区

关闭