<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > C++中類的分層設(shè)計(jì)(純虛函數(shù))

          C++中類的分層設(shè)計(jì)(純虛函數(shù))

          作者: 時(shí)間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
          面向?qū)ο笤O(shè)計(jì)是一種思想,而C++恰好是一種面向?qū)ο蟮恼Z言,在C++中設(shè)計(jì)類一般都會(huì)采用繼承基類(父類),設(shè)計(jì)派生類(子類),繼承和動(dòng)態(tài)綁定的結(jié)合就巧妙的實(shí)現(xiàn)了實(shí)際的問題。但是如何設(shè)計(jì)出一個(gè)強(qiáng)大的類呢?今天在學(xué)習(xí)了純虛函數(shù)以后,我又覺得分層設(shè)計(jì)的思想真的是一個(gè)非常棒的設(shè)計(jì)思想。


          首先說明一下我只是一個(gè)初學(xué)者,寫出來的東西可能會(huì)有錯(cuò)誤,說實(shí)在的沒寫過多少代碼,但是我認(rèn)為寫代碼是一個(gè)熟練的過程,一個(gè)完成思想的過程。只有有了思想,才能完成好的設(shè)計(jì),不斷的思考,不斷的總結(jié)才能學(xué)到新學(xué)到的東西,才能達(dá)到更高的目標(biāo)。

          在C++中虛函數(shù)是指將一個(gè)類中的虛函數(shù)后面加上=0,就說明該虛函數(shù)為純虛函數(shù)。一般該函數(shù)設(shè)置為純虛函數(shù),那么該函數(shù)也就沒有再次定義的必要了,因?yàn)榇嬖诩兲摵瘮?shù)的類就是一個(gè)抽象類,是不能夠創(chuàng)建對(duì)象的,不能創(chuàng)建對(duì)象也就不會(huì)主動(dòng)的調(diào)用該函數(shù),哪怕在動(dòng)態(tài)綁定的情況下也不會(huì),因此不需要為該函數(shù)定義相關(guān)的操作,實(shí)質(zhì)上在此處聲明只是說明在該派生類中需要重寫基類的虛函數(shù),至于是否真的復(fù)寫,不要去關(guān)心。

          本文引用地址:http://www.ex-cimer.com/article/201612/324491.htm

          //存在純虛函數(shù)的類為抽象類
          class AbstructClass:public Base
          {
          public:
          //構(gòu)造函數(shù)
          AbstructClass(...):Base(...),...{}
          //析構(gòu)函數(shù)
          ~AbstructClass(){...}
          //這就是純虛函數(shù),一般func在基類中就為虛函數(shù),因此virtual也可以不寫
          virtual func(...) const = 0;
          //保證派生類能夠訪問數(shù)據(jù)成員,必須設(shè)置為protected
          protected:
          //一些數(shù)據(jù)成員定義
          ...
          };

          抽象類的作用主要是幫助完成實(shí)際派生類的設(shè)計(jì),為什么這么說呢?如果我們只創(chuàng)建一個(gè)基類,直接繼承基類創(chuàng)建實(shí)際的派生類,存在很多的問題,為什么這么說呢?比如說我要?jiǎng)?chuàng)建一個(gè)人的類,我們每一個(gè)人都是一個(gè)人的對(duì)象,在人的基類中一般只是包含了人的共性,不可能將某一個(gè)人的特殊定義到類中,當(dāng)然為了繼承,肯定也會(huì)創(chuàng)建一系列的虛函數(shù)。如果我們每一個(gè)人都直接從該基類派生,人的個(gè)體在世界上有60多億,我們每一個(gè)人實(shí)際上就是一個(gè)派生類,因?yàn)槊恳粋€(gè)人都不同,都有自己獨(dú)特的特性(假設(shè)是一種數(shù)據(jù)對(duì)象),如果要實(shí)現(xiàn)這么多的派生類真的是一個(gè)不可想象的,而且我們可以知道很多人(類)實(shí)際上存在很多的相似性。

          這時(shí)我們實(shí)際上就可以采用抽象類來幫忙完成我們的設(shè)計(jì)。抽象類是連接在基類和實(shí)際派生類之間的中間類,實(shí)際派生類的直接基類是抽象類,也就說說基類是實(shí)際派生類的間接基類。在抽象層中主要完成什么操作呢?抽象層中主要完成對(duì)派生類共性數(shù)據(jù)成員的定義,為了方便派生類的數(shù)據(jù)訪問,必須設(shè)置為受保護(hù)訪問權(quán)限,創(chuàng)建純虛函數(shù),定義構(gòu)造函數(shù),應(yīng)該在初始化列表中首先創(chuàng)建基類對(duì)象,然后才能完成其他成員的初始化,有時(shí)候可能需要復(fù)制控制函數(shù)的實(shí)現(xiàn)。

          在實(shí)際的派生類設(shè)計(jì)過程中就不再直接從基類繼承,而是從抽象類中繼承,因?yàn)槌橄箢愔性黾恿艘恍┦鼙Wo(hù)成員數(shù)據(jù),且這些數(shù)據(jù)成員時(shí)派生類的共性,因此派生類中可以很方便的訪問。同時(shí)在該派生類中就應(yīng)該完成虛函數(shù)的復(fù)寫操作,因?yàn)閯?dòng)態(tài)綁定以后會(huì)直接調(diào)用該版本的虛函數(shù)。當(dāng)然有時(shí)候也要完成復(fù)制控制函數(shù)的定義。當(dāng)然可以設(shè)計(jì)很多基于抽象類的派生類。當(dāng)然在派生類中也可以增加自己的數(shù)據(jù)成員。

          //實(shí)際派生類從抽象類中繼承
          class ActualClass : public AbstructClass
          {
          public:
          ActualClass(...):AbstructClass(...),...{}
          //派生類中復(fù)寫虛函數(shù)
          func()
          {...}
          private:
          //派生類的一些數(shù)據(jù)
          ...
          };

          基本的思想如下圖所示:


          從上面的圖可知,我們可以在實(shí)際的派生類與基類之間增加一個(gè)中間層,這種實(shí)現(xiàn)方式不僅能夠更好的隱藏?cái)?shù)據(jù),而且比較好的解決了我們上面提到的派生類過實(shí)現(xiàn)過于復(fù)雜的問題。因此我們可以認(rèn)為抽象類實(shí)際上就是一個(gè)分層設(shè)計(jì)的方法,也可以認(rèn)為是一個(gè)分成更加精細(xì)子類的方式方法,也就是說在基類的基礎(chǔ)上將對(duì)象分成很多子類(抽象類),然后在各個(gè)子類下設(shè)計(jì)新的派生類。比如在圖中的抽象類1,抽象類2是不同的,是兩種不同的分類,這候我們給予兩個(gè)抽象類的派生類當(dāng)然也就存在了差別。這樣實(shí)現(xiàn)的好處能夠避免很多的重復(fù)代碼。


          上一頁 1 2 下一頁

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();