C++中类的分层设计(纯虚函数)

发布者:自在自由最新更新时间:2015-05-06 来源: 51hei关键字:C++  分层设计  纯虚函数 手机看文章 扫描二维码
随时随地手机看文章
   面向对象设计是一种思想,而C++恰好是一种面向对象的语言,在C++中设计类一般都会采用继承基类(父类),设计派生类(子类),继承和动态绑定的结合就巧妙的实现了实际的问题。但是如何设计出一个强大的类呢?今天在学习了纯虚函数以后,我又觉得分层设计的思想真的是一个非常棒的设计思想。

 
    首先说明一下我只是一个初学者,写出来的东西可能会有错误,说实在的没写过多少代码,但是我认为写代码是一个熟练的过程,一个完成思想的过程。只有有了思想,才能完成好的设计,不断的思考,不断的总结才能学到新学到的东西,才能达到更高的目标。
 
    在C++中虚函数是指将一个类中的虚函数后面加上=0,就说明该虚函数为纯虚函数。一般该函数设置为纯虚函数,那么该函数也就没有再次定义的必要了,因为存在纯虚函数的类就是一个抽象类,是不能够创建对象的,不能创建对象也就不会主动的调用该函数,哪怕在动态绑定的情况下也不会,因此不需要为该函数定义相关的操作,实质上在此处声明只是说明在该派生类中需要重写基类的虚函数,至于是否真的复写,不要去关心。

    //存在纯虚函数的类为抽象类
    class AbstructClass:public Base
    {
    public:
        //构造函数
        AbstructClass(...):Base(...),...{}
        //析构函数
        ~AbstructClass(){...}
       //这就是纯虚函数,一般func在基类中就为虚函数,因此virtual也可以不写
        virtual func(...) const = 0;
    //保证派生类能够访问数据成员,必须设置为protected
    protected:
       //一些数据成员定义
       ...
    };

   抽象类的作用主要是帮助完成实际派生类的设计,为什么这么说呢?如果我们只创建一个基类,直接继承基类创建实际的派生类,存在很多的问题,为什么这么说呢?比如说我要创建一个人的类,我们每一个人都是一个人的对象,在人的基类中一般只是包含了人的共性,不可能将某一个人的特殊定义到类中,当然为了继承,肯定也会创建一系列的虚函数。如果我们每一个人都直接从该基类派生,人的个体在世界上有60多亿,我们每一个人实际上就是一个派生类,因为每一个人都不同,都有自己独特的特性(假设是一种数据对象),如果要实现这么多的派生类真的是一个不可想象的,而且我们可以知道很多人(类)实际上存在很多的相似性。
 
    这时我们实际上就可以采用抽象类来帮忙完成我们的设计。抽象类是连接在基类和实际派生类之间的中间类,实际派生类的直接基类是抽象类,也就说说基类是实际派生类的间接基类。在抽象层中主要完成什么操作呢?抽象层中主要完成对派生类共性数据成员的定义,为了方便派生类的数据访问,必须设置为受保护访问权限,创建纯虚函数,定义构造函数,应该在初始化列表中首先创建基类对象,然后才能完成其他成员的初始化,有时候可能需要复制控制函数的实现。
 
    在实际的派生类设计过程中就不再直接从基类继承,而是从抽象类中继承,因为抽象类中增加了一些受保护成员数据,且这些数据成员时派生类的共性,因此派生类中可以很方便的访问。同时在该派生类中就应该完成虚函数的复写操作,因为动态绑定以后会直接调用该版本的虚函数。当然有时候也要完成复制控制函数的定义。当然可以设计很多基于抽象类的派生类。当然在派生类中也可以增加自己的数据成员。

 

    //实际派生类从抽象类中继承
    class ActualClass : public AbstructClass
    {
    public:
        ActualClass(...):AbstructClass(...),...{}
        //派生类中复写虚函数
        func()
        {...}
    private:
        //派生类的一些数据
        ...
    };

基本的思想如下图所示:

 
   从上面的图可知,我们可以在实际的派生类与基类之间增加一个中间层,这种实现方式不仅能够更好的隐藏数据,而且比较好的解决了我们上面提到的派生类过实现过于复杂的问题。因此我们可以认为抽象类实际上就是一个分层设计的方法,也可以认为是一个分成更加精细子类的方式方法,也就是说在基类的基础上将对象分成很多子类(抽象类),然后在各个子类下设计新的派生类。比如在图中的抽象类1,抽象类2是不同的,是两种不同的分类,这候我们给予两个抽象类的派生类当然也就存在了差别。这样实现的好处能够避免很多的重复代码。[page]
 
    就假设我们要实现一个比较简单的校园人类,假设已经存在了一个人的基类(Base),那么学校的人存在很多的特征,但是我认为主要分成了3大类,主要是学生、教师、服务人员,因此可以再基类的基础上派生出三个抽象类,Studtent, Teacher, Service,就如同上面的抽象类1,抽象类2,抽象类3。这时候设计一个实际的派生类也就减小了很多的冗余。但是我们觉得还是会存在很多的相似之处,比如学生类而言,还是可以再分,可以分为男女,这样分并不是最好的,我们实际上可以按照专业分,这时候又可以再Student的基础上派生出不同的学生专业抽象类,在各个专业下又可以分为博士、研究生、大学生抽象类,在这些抽象类的基础上还可以分为男女抽象类,到这时就可以直接完成具体每一个派生类的实现啦,这时候的直接基类就是男女学生抽象类,这样就形成了一个多层次的分解问题,将一个大的问题分解成了很多的子类,在子类的基础上在分成更细的子类,最后到达一个精细的抽象子类,这时实现一个具体的派生类就会非常的方便。也就减少了很多的冗余代码,虽然设计的类更多了,但是实现的方式会更加的容易。所以说分层设计的思想是一个重要的思想,分层就能将一个大问题逐步喜欢,而在C++中纯虚函数(抽象类)的运用就能够巧妙的解决这种多层次设计问题。所以说我们的分层设计不仅仅只是单一层的,也可以是多层次的。如下图所示:
 
    因此我们应该掌握C++中这种纯虚函数的用法,只有掌握了这种设计方法才能实现更加漂亮的类设计。当然上面只是我的一些遐想。具体的实现过程还需要在经后的实践中练习。在类的设计中多增加抽象类能够简化类的冗余度,使得类能更加方便的被继承。从上面的结果我们可以将分层设计看做一个树形结构,基类就是树的根,而实际的派生类是就是叶,而那些中间的抽象层就是节点。

关键字:C++  分层设计  纯虚函数 引用地址:C++中类的分层设计(纯虚函数)

上一篇:C++/C中的字符串
下一篇:散列的C语言实现

推荐阅读最新更新时间:2024-03-16 14:00

诺基亚手机四连发 C100/C200/G100/G400推出
HMD Global发布了四款新手机,即诺基亚C100、诺基亚C200、诺基亚G100和诺基亚G400。最新发布的C系列和G系列手机正在向美国市场推出,该公司可能也会在其他市场销售其中一些设备。C100、C200、G100和G400的价格都在250美元以下。 诺基亚C100和C200提供常用配置,如联发科Helio A22芯片、3GB RAM、32GB内置存储、Android 12操作系统、4,000mAh电池和单个后置摄像头。C200则拥有更大的6.1英寸屏幕。诺基亚C100和C200手机的售价分别为99美元(约630元)和119美元(约757元)。 诺基亚G100则拥有6.5英寸屏幕,可提供HD+分辨率。它搭载骁龙61
[手机便携]
基于PAX270+EP2C20的真空冻干控制系统设计
冷冻干燥技术自1980年代在我国兴起以来已取得长足发展,并已广泛应用于食品、低温和真空等科学领域,基于一些食品和药品加工行业的工艺需要,真空冷冻干燥技术需要迅速应用与推广。控制系统对物料的加工过程和质量影响比较大,还决定了真空冷冻干燥装置运行的自动化程度。近年来国内外一些有实力的厂家对冻干机控制系统的研究有了较大的进展,采用了PLC、触摸屏等装置,能够绘制冻干过程的工艺曲线,较大地改善了冻干机的性能。 随着科技的发展,由于触摸屏和PLC控制系统不易实现功能扩展、升级困难、操作界面不够丰富等原因,已经不能完全满足企业的需要,市场需要开发出更加先进的冻干设备控制系统。2007年1月上海远东制药机械总厂开发完成了目前国内最先进的嵌
[单片机]
基于PAX270+EP2<font color='red'>C</font>20的真空冻干控制系统<font color='red'>设计</font>
I2C总线数字式温湿度传感器SHT11及其在单片机系统的应用
摘要:SHT11是瑞士Sensirion公司生产的具有I2C总线接口的单片全校准数字式相对湿度和温度传感器。该传感器采用独特的CMOSens TM技术,具有数字式输出、免调试、免标定、免外围电路及全互换的特点。文中对传感器的性能特点、接口时序与命令进行了详细的阐述,给出了SHT11与单片机的接口电路及相应程序。 关键词:数字式;温湿度传感器;I2C总线;单片机 1 概述 温湿度的测量在仓储管理、生产制造、气象观测、科学研究以及日常生活中被广泛应用,传统的模拟式湿度传感器一般都要设计信号调理电路并需要经过复杂的校准和标定过程,因此测量精度难以保证,且在线性度、重复性、互换性、一致性等方面往往不尽人意。SHT11是瑞士Sens
[单片机]
基于C8051F350的无线同步数据采集系统的实现
   1 引言   飞行员操纵飞机时,除了通过各种仪表了解飞机的飞行姿态外,还要通过直接对操纵杆(或方向舵)施力来感受飞机的飞行姿态。歼击机操纵杆/舵操纵力一位移性能评估是歼击机产品质量检测的主要项目之一,是指根据歼击机操纵杆/舵操纵力一位移性能指标要求,检测出其力和位移是否在规定的范围内,并最终给出评估结果。其中力和位移是同一时刻的相对数据,因此要求采集必须同步。该系统主要完成对歼击机操纵杆/舵操纵力和位移的同步数据采集,并通过无线的方法将采集到的力、位移数据传输给评估系统,为评估系统提供绘制力一位移曲线准确的测量数据。    2 系统整体设计   歼击机操纵杆/舵操纵力一位移性能检测评估系统由采集系统Ⅲ和评估系统构成。采
[单片机]
利用C2000 MCU实施并网微型太阳能逆变器(一)
摘要   可再生能源应用的迅猛发展将引发第四次工业革命。光伏发电是整个可再生能源方案的关键部分。在所有太阳能逆变器中,微型太阳能逆变器是至关重要的组成部分。   本文将为您介绍如何利用一个TMS320F2802设计一种低成本、高性能的微型太阳能逆变器。另外,文章还将讨论如何使用交叉式有源钳位反激和SCR全桥实现一个220W输出的微型太阳能逆变器,并介绍完整的系统固件架构和控制方法。最后,文章还会为您展示实验室波形。   1 概述   1.1 太阳能逆变器介绍   材料、能源和信息是人类生存和发展的三大要素。能源利用的每一次新发现,都会极大改变和促进现代文明的发展:    · 蒸汽机的发明让我们进入机器时代。   
[模拟电子]
利用<font color='red'>C</font>2000 MCU实施并网微型太阳能逆变器(一)
C程序中的缓冲输入设计
缓冲输入,很早之前就听说过这个概念,一直不怎么理解。后来,一听到缓冲,脑子就昏沉沉的。其实,缓冲输入也没啥大不了的,只要有打破砂锅想到底的精神,就能扫除以前所有的似是而非。 缓冲输入(buffered input ),就是说输入时键入的一系列字符不是直接发给程序,而是被存放在一个叫做缓冲区的临时存储单元里。也就是说,这些字符以序列(sequence)的形式暂存于缓冲区,然后等程序一个一个地取(fetch one by one)。 那么,这些字符是怎样进入缓冲区的呢?通过enter键。不过别忘了,enter建也是一个字符,所以,缓冲区里的字符串总是应该以enter键结束的。(当然,还有另外一种情况,键盘缓冲区是有空间限制的,填满之后
[单片机]
USB Type-C 与Lightning 取代难度高
    不知道各位有没有想过,如果有一天你的智能型手机的耳机孔消失了,取而代之的耳机孔是和智能型手机的资料与充电孔位共用?其实这消息是来自iPhone 7 谣传将3.5mm的耳机孔取消,改由Lightning接口外接耳机。无独有偶的,Intel日前在IDF上也提出关于使用USB Type-C 的技术与策略,让3.5mm这已经出现超过50年,现今最流行的类比音讯孔终于有机会终结?   无论这件事情可不可能发生,我们先来看看取消3.5mm 耳机孔后的优点在哪?首先就是各大智能型手机在外型设计上最在意的厚度,3.5mm 的耳机孔最少大约需要5mm 的厚度才放得进去,若使用Lightning 或是USB Type-C,在整体厚度部
[手机便携]
C8051F340单片机为核心的红外测温系统设计
引言 螺旋装药过程中,经常会因为内部药品温度分布不均匀导致在装药过程中药品内出现气泡的现象,这严重影响了弹体内的药品质量和弹药参数。因此,本文希望通过设计一种温度监测系统来实现对腔体内药品温度检测,寻找装药过程中温度与药品质量之间的关系。由于装药机结构的特殊性,我们无法通过传统的接触测温法获取药品的温度。因此本文设计了一种基于红外测温方法的系统来实现对药品温度的实时检测。 1 时分复用原理 复用方法的设计主要依据TN9红外传感器的信号特征及接口特点,TN9红外温度传感器具有5个接口,其中电源和地不需要接到CPLD上,其余三个接口分别为低电平有效的TN9工作使能接口,工作在主模式的SPI时钟接口和数据接口。采用复用模式是只需通过设置
[单片机]
以<font color='red'>C</font>8051F340单片机为核心的红外测温系统<font color='red'>设计</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved