C++抽象编程——面向对象(1)——类的分级和继承

接下来的系列我们讲讲面向对象,C++的精髓部分。其实我也好久没看了,还是上个学期学过的东西。老师讲的很模糊,但是这本书讲的很不错。下面我就分析一下这本书的总结吧。

类的层次结构

让我们先回忆一下我们之前提到过的输入输出流,当C++的设计者承担了输入/输出库现代化的任务时,他们选择采用面向对象的方法。该决策的一个含义是讲流库中的数据类型类以类的方式去实现。与表示数据的旧策略相比,类具有许多优点。其中最重要的是,类提供了一个封装(encapsulation)框架,这是将数据表示和相关操作组合成一个连贯的整体的过程,它显示出尽可能少的关于底层结构的细节。 您当你使用这些类时,你不用知道如何实现它们。作为客户端,需要知道的是哪些方法可用于这些类以及如何调用它们。
除此之外,面向对象编程除了封装之外还提供了其他重要的优点。面向对象语言中的类形成层次结构,其中每个类自动获取层次结构中之前的类的特征。这个属性称为继承(nheritance)。虽然C++倾向于使用比许多面向对象语言更少的继承性,但它仍然是将面向对象范例与早期编程模型分开的功能之一。

生物等级制(Biological hierarchies)

面向对象语言的阶级结构在许多方面与瑞典植物学家Carl Linnaeus在十八世纪开发的生物分类系统相似,是代表生物世界结构的一种方式。在他的观念中,生物首先被细分为一个个王国。原始系统只包含植物和动物王国,但有某些形式的生命 - 如真菌和细菌 - 不适合任何类别,现在拥有自己的王国。然后每个王国进一步细分为门,阶级,秩序,家庭,属和物种的等级类别。 每一个生物都属于这个层次结构的底部,也属于每个上层的一些类别。
该生物分类系统如图4-5所示,显示了普通黑色蚂蚁的分类,其具有与其属和种类相对应的拉西乌斯的科学名称。 然而,这种蚂蚁也是科螨科的一部分,它是将其确定为蚂蚁的分类。 Lasius niger从层次上向上移动,也是膜翅目(包括蜜蜂和黄蜂),昆虫纲(昆虫组成)和节肢动物门(也包括例如贝类和 蜘蛛)。
使这种生物分类系统有用的一个属性是所有的生物都属于层次结构中每个层级的一个类别。 因此,每个个人生命形式同时属于几个类别,并且继承了每个特征的属性。 例如,Lasius niger是一种蚂蚁,一种昆虫,节肢动物和一种动物,同时也是一种动物。 此外,每个蚂蚁都分享其从每个类别继承的属性。 昆虫纲课程的特征之一是昆虫有六条腿。 因此,所有的蚂蚁必须有六条腿,因为蚂蚁是该类的成员。

生物隐喻也有助于说明类和物体之间的区别。 每个常见的黑色蚂蚁都具有相同的分类,但是可以有许多不同的蚂蚁都适合这种单一的模式。每只蚂蚁都是Lasius niger的一个实例。 在面向对象编程的语言中,Lasius niger是一个类,每个蚂蚁都是一个对象。

stream类的层次结构

流库中的类形成了与上面介绍的生物层次相似的层次结构。到目前为止,我们已经看到了两种类型的输入流 - ifstream和istringstream,以及两种类型的输出流-ofstream和ostringstream - 每个配对共享一组常用的操作。 在C++中,这些类形成下图所示的层次结构。

层次结构的顶部是类ios,它表示可用于任何类型的I/O的通用流类型。然后,层次结构被分为两类:分别是输入流和输出流的概念的泛型和ostream。C++文件和字符串流类然后自然落入此层次结构中的适当位置。
在该图中,使用与上面图中的进化图相同的几何结构绘制,每个类是在层次结构中出现在其上的类的子类(subclass)。因此,istream和ostream都是ios的子类。 在相反的方向,ios被称为istream和ostream的超类(superclass)。该图的不同层次存在类似的关系。 例如,ifstream是istream的子类,ostream是ofstream的超类。
子类和超类之间的关系在很多方面是由英文单词最好地传达的。每个ifstream对象也是一个istream, 与生物层次结构一样,这种关系意味着任何类的特征都由其子类继承。 在C++中,这些特征对应于与该类相关联的方法和其他定义。因此,如果istream类导出一个特定的方法,则该方法可以自动用于任何ifstream或istringstream对象. 更全面地说,ios类导出的任何方法都可用于图4-6所示的层次结构中的每个类。

如图所示。该图采用标准方法的一部分,用于说明通用建模语言的类层次,简称为UML(This enhanced diagram adopts parts of a standard methodology for illustrating class hierarchies called the Universal Modeling Language, or UML for short.)。 在UML中,每个类都显示为矩形框,其上部包含类的名称。 该类导出的方法显示在下部。 在UML图中,子类使用箭头来指向它们的超类。

图中所示的UML图可以很容易地确定图中每个类可用的方法。因为每个类都继承其超类链中每个类的方法,所以特定类的对象可以调用任何这些类中定义的任何方法。 例如,该图表示任何ifstream对象可以访问以下方法:

  • 来自ifstream类的open和close方法本身(The open and close methods from the ifstream class itself
  • 来自istream类的get和unget方法和>>运算符(The get and unget methods and the >> operator from the istream class
  • 来自ios类的clear,fail和eof方法(The clear, fail, and eof methods from the ios class

多重继承(Multiple inheritance)

虽然继承在标准库中的各个地方都被使用,但它并不像C++中广泛使用,因为它往往是面向其他面向对象的语言,尤其是Java。 因此,尽管在现有库包(如实现流)的情况下了解继承是必要的。C++中的继承比其他语言更为强大,因此更为复杂。将C++与现在常用的其他面向对象语言分开的功能之一是,类可以从多个超类(这个时候应该称为父类)继承行为,这个属性称为多重继承(*One of the features that sets C++ apart from other object-oriented languages in common use
today is that classes can inherit behavior from more than one superclass. This property is called multiple inheritance.*)。 虽然这些我们以后才会提到。但是看看它是如何用于设计现有的库包是有用的。
strream层次结构使用多个继承来定义既是输入流又包含输出流的新类。下图显示了这些类如何适合整个流层次结构的UML图。从iostream引导到istream和ostream的箭头,iostream类继承了两个超类的方法,然后它传递给它的子类。

假设你已经分配了写入一个roundToSignificantDigits函数的任务,该函数接受浮点值x并将其舍入到某些指定数量的有效数字。例如,如果调用

roundToSignificantDigits(3.14159265, 5);

该函数应将π舍入的值返回到5位有效数字,即3.1416 虽然可以以其他方式写这个功能,但最简单的策略是使用流已经提供的设施。 所有您需要做的是将x的值写入输出流,将精度设置为所需数字位数,然后读取相同的值以将其转换为其数字形式。 以下实现只是使用一个字符串流(它是一个istream和一个ostream)来存储中间字符串,

double roundToSignificantDigits(double x, int nDigits) {
    stringstream ss;
    ss << setprecision(nDigits) << x;
    ss >> x;
    return x;
}
对于CentOS7系统,如果需要重新分配磁盘空间,可以按照以下步骤进行操作: 1. 使用LVM(逻辑卷管理)的方式进行扩容。可以使用fdisk命令查看磁盘空间是否增加,但是需要注意,新增的空间还没有进行分区划分,没有被划分到根目录。可以使用以下命令添加新分区: fdisk /dev/sda 然后选择n来添加新分区。 2. 执行以下命令,使系统重新扫描磁盘空间: echo 1 > /sys/block/sda/device/rescan 然后使用fdisk -l命令查看空间是否已经增加。 3. 使用lvextend命令将home空间重新分配扩容给根目录。 例如,如果将50G的home空间分配40G给根目录,可以使用以下命令: lvextend -L 40G /dev/centos/root 通过以上步骤,可以重新分配CentOS 7的磁盘空间。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [linuxCentos7的LVM磁盘扩容问题](https://download.csdn.net/download/weixin_38631773/14891934)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [CentOS7 磁盘重新调整分配](https://blog.csdn.net/qq_29277155/article/details/126847199)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Centos磁盘空间转移重新分配](https://blog.csdn.net/weixin_45380725/article/details/130828948)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值