欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

面向?qū)ο缶幊獭摵瘮?shù)

AGk5_ZLG_zhiyua ? 來(lái)源:未知 ? 作者:佚名 ? 2017-10-20 11:52 ? 次閱讀

周立功教授數(shù)年之心血之作《程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)》以及《面向AMetal框架與接口編程(上)》,電子版已無(wú)償性分享到電子工程師與高校群體,書本內(nèi)容公開后,在電子行業(yè)掀起一片學(xué)習(xí)熱潮。經(jīng)周立功教授授權(quán),本公眾號(hào)特對(duì)《程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)》一書內(nèi)容進(jìn)行連載,愿共勉之。

第四章為面向?qū)ο缶幊?/span>,本文為 4.4虛函數(shù)。

>>> 4.4.1 二叉樹

樹的應(yīng)用非常廣泛,比如,數(shù)據(jù)庫(kù)就是由樹構(gòu)造而成的,C編譯器的詞法分析器也是經(jīng)過(guò)語(yǔ)法分析生成的樹。

樹是一種管理象樹干、樹枝、樹葉一樣關(guān)系的數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),通常一棵樹由根部長(zhǎng)出一個(gè)樹干,接著從樹干長(zhǎng)出一些樹枝,然后樹枝上又長(zhǎng)出更小的樹枝,而葉子則長(zhǎng)在最細(xì)的樹枝上,樹這種數(shù)據(jù)結(jié)構(gòu)正是象一棵樹倒過(guò)來(lái)的樹木。

樹是由結(jié)點(diǎn)(頂點(diǎn))和枝構(gòu)成的,由一個(gè)結(jié)點(diǎn)作為起點(diǎn),這個(gè)起點(diǎn)稱為樹的根結(jié)點(diǎn)。從根結(jié)點(diǎn)上可以連出幾條枝,每條枝都和一個(gè)結(jié)點(diǎn)相連,延伸出來(lái)的這些結(jié)點(diǎn)又可以繼續(xù)通過(guò)枝延伸出新的結(jié)點(diǎn)。這個(gè)過(guò)程中的舊結(jié)點(diǎn)稱作父結(jié)點(diǎn),而延伸出來(lái)的新結(jié)點(diǎn)稱作子結(jié)點(diǎn),一個(gè)子結(jié)點(diǎn)都沒(méi)有的結(jié)點(diǎn)就叫做葉子結(jié)點(diǎn)。另外,從根結(jié)點(diǎn)出發(fā)到達(dá)某個(gè)結(jié)點(diǎn)所要經(jīng)過(guò)的枝的個(gè)數(shù)叫做這個(gè)結(jié)點(diǎn)的深度。

從家譜樹血緣關(guān)系來(lái)看,家譜樹使得介紹計(jì)算機(jī)科學(xué)中用于描述樹結(jié)構(gòu)的術(shù)語(yǔ)變得更簡(jiǎn)單了。樹中的每一個(gè)結(jié)點(diǎn)都可以有幾個(gè)孩子,但是只有一個(gè)雙親。在樹中祖先和孫子的意義與日常語(yǔ)言中的意義完全相同。

與根形成對(duì)比的是沒(méi)有孩子的結(jié)點(diǎn),這些結(jié)點(diǎn)稱為葉,而既不是根又不是葉的結(jié)點(diǎn)稱為內(nèi)部結(jié)點(diǎn),樹的長(zhǎng)度定義為從根到葉的最長(zhǎng)路徑的長(zhǎng)度(或深度)。在一顆樹里,如果從根到葉的每條路徑的長(zhǎng)度都大致相等,那么這顆樹被稱為平衡樹。實(shí)際上,要實(shí)現(xiàn)某種永遠(yuǎn)能夠保證平衡的樹是很復(fù)雜的,這也是為什么存在多種不同種類的樹的原因。

實(shí)際上,在樹的每一層次都是分叉形式,如果任意選取樹中的一個(gè)結(jié)點(diǎn)和它的子樹,所得到的部分都符合樹的定義。樹中的每個(gè)結(jié)點(diǎn)都可以看成是以它自己為根的子樹的根,這就是樹結(jié)構(gòu)的遞歸特性。如果以遞歸的觀點(diǎn)考察樹,那么樹只是一個(gè)結(jié)點(diǎn)和一個(gè)附著其上的子樹的集合——在葉結(jié)點(diǎn)的情景下該集合為空,因此樹的遞歸特性是其底層表示和大部分針對(duì)樹操作的算法的基礎(chǔ)。

樹的一個(gè)重要的子類是二叉樹,二叉樹是一種常用的樹形數(shù)據(jù)結(jié)構(gòu)。二叉樹的每個(gè)結(jié)點(diǎn)最多只有兩個(gè)子結(jié)點(diǎn)(left和right),且除了根以外的其它結(jié)點(diǎn),要么是雙親結(jié)點(diǎn)的左孩子,要么是右孩子。

>>> 4.4.2 表達(dá)式算術(shù)樹

1、問(wèn)題

求解算術(shù)表達(dá)式就是一種二叉樹,它的結(jié)點(diǎn)包含兩種類型的對(duì)象:操作符和終值。操作符是擁有操作數(shù)的對(duì)象,終值是沒(méi)有操作數(shù)的對(duì)象。表達(dá)式樹背后的思想——存儲(chǔ)在父結(jié)點(diǎn)中的是操作符,其操作數(shù)是由子結(jié)點(diǎn)延伸的子樹組成的。操作數(shù)有可能是終值,或它們本身也可能是其它的表達(dá)式。表達(dá)式在子樹中展開,終值駐留在葉子結(jié)點(diǎn)中,這種組織形式的好處是可以通過(guò)表達(dá)式將一個(gè)表達(dá)式轉(zhuǎn)換為3種常見的表示形式:前綴、中綴和后綴,但中綴表達(dá)式是在數(shù)學(xué)中學(xué)到的最為熟悉的表達(dá)方式。在這里,將以2*(3+4)+5中綴表達(dá)式算術(shù)樹結(jié)構(gòu)為例。

首先將“2*(3+4)+5”拆分為左子樹和右子樹,其中,“+” 為根節(jié)點(diǎn),左子樹的值為2*(3+4),右子樹的值為5;接著將2*(3+4)拆分為左子樹和右子樹,其中,“*”為根節(jié)點(diǎn),左子樹的值為2,右子樹的值為3+4;然后將3+4拆分為左子樹和右子樹,其中,“+”為根節(jié)點(diǎn),左子樹的值為3,右子樹的值為4,詳見圖 4.6。注意,樹的表示法中不需要任何小括號(hào)或運(yùn)算符優(yōu)先級(jí)的知識(shí),因?yàn)樗枋龅挠?jì)算過(guò)程是唯一的。

圖 4.6 表達(dá)式算術(shù)樹

由此可見,從根結(jié)點(diǎn)(Node)到葉進(jìn)行分析,該表達(dá)式算術(shù)樹的結(jié)點(diǎn)是算術(shù)運(yùn)算符“+(Additive)”和“*(Multiplicative)”,它的樹葉是操作數(shù)(Number)。由于這里所有的操作都是二元(Binary)的,即每個(gè)結(jié)點(diǎn)最多只有兩個(gè)孩子,這顆特定的樹正好是二叉樹。因此可以用以下方式計(jì)算(calculate,簡(jiǎn)寫為calc)每個(gè)結(jié)點(diǎn):

  • 如果是一個(gè)數(shù)字,則返回它的值;

  • 如果是一個(gè)運(yùn)算符,則計(jì)算左子樹和右子樹的值。

其計(jì)算過(guò)程是先分別輸入3和4,接著計(jì)算3+4;然后輸入2,再接著計(jì)算2*(3+4);接著輸入5,最后計(jì)算2*(3+4)+5。

傳統(tǒng)的做法是定義一個(gè)struct _Node,包含二元運(yùn)算符和數(shù)字結(jié)點(diǎn),詳見程序清單 4.12。

程序清單 4.12 表達(dá)式算術(shù)樹接口(calctree.h)

其中,使用了名為newNumNode、newAddNode和newMultNode的宏將結(jié)構(gòu)體初始化,表達(dá)式算術(shù)樹接口的實(shí)現(xiàn)詳見程序清單 4.13。

程序清單 4.13 表達(dá)式算術(shù)樹接口的實(shí)現(xiàn)(cacltree.c)

表達(dá)式算術(shù)樹的使用范例詳見程序清單 4.14。

程序清單 4.14 表達(dá)式算術(shù)樹使用范例

如果此方案應(yīng)用于包括上百個(gè)結(jié)點(diǎn)的樹時(shí),其消耗的內(nèi)存太大了。

2、抽象類

根據(jù)問(wèn)題的描述,需求詞匯表中有一組這樣的概念,比如,根結(jié)點(diǎn)和左右葉子結(jié)點(diǎn)的操作數(shù),且加法和乘法都是二元操作。雖然詞匯表對(duì)應(yīng)的詞匯為Node、_pLeft、_pRight、Number、Binary、Additive和Multiplicative,但用Node、_pLeft、_pRight、NumNode、BinNode、AddNode和MultNode描述表達(dá)式算術(shù)樹的各個(gè)結(jié)點(diǎn)更準(zhǔn)確。

由于AddNode和MultNode都是二元操作,其共性是兩個(gè)數(shù)(_pLeft和_pRight)的計(jì)算,其可變性分別為加法和乘法,因此可以將它們的共性包含在BinNode中,可變性分別包含在AddNode和MultNode中。

其實(shí)輸入操作數(shù)同樣可以視為計(jì)算,因此NumNode和BinNode的共性也是計(jì)算,不妨將它們的共性上移到Node抽象類中。

顯然,基于面向?qū)ο蟮腃編程,則表達(dá)式算術(shù)樹的所有結(jié)點(diǎn)都是從類Node繼承的子類,Node的直系后代為NumNode和BinNode,NumNode表示一個(gè)數(shù),BinNode表示一個(gè)二元運(yùn)算,然后再?gòu)腂inNode派生兩個(gè)類:AddNode和MultNode。

圖 4.7 結(jié)點(diǎn)的類層次

如圖 4.7所示展示了類的層次性,它們是一種“is-a”的抽象層次結(jié)構(gòu),子類AddNode和MultNode重新定義了BinNode和Node基類的結(jié)構(gòu)和行為。基類代表了一般化的抽象,子類代表了特殊的抽象。雖然抽象類Node或BinNode不能實(shí)例化,只能作為其它類的父類,但NumNode、AddNode和MultNode子類是可以實(shí)例化的。Node抽象類的定義如下:

除了Node之外,每個(gè)子類都要實(shí)現(xiàn)自己的nodeCalc計(jì)算方法,并返回一個(gè)作為計(jì)算結(jié)點(diǎn)值的雙精度數(shù)。即:

其中的NumNode結(jié)點(diǎn)是從Node分出來(lái)的,_num表示數(shù)值。BinNode也是從Node分出來(lái)的,_pLeft和_pRight分別為指向左子樹和右子樹的指針,而AddNode和MultNode又是從BinNode分出來(lái)的。

此前,針對(duì)繼承和多態(tài)框架,使用了一種稱為靜態(tài)的初始化范型。在這里,將使用動(dòng)態(tài)內(nèi)存分配初始化范型處理繼承和多態(tài)框架。

3、建立接口

由于對(duì)象不同,因此動(dòng)態(tài)分配內(nèi)存的方式不一樣,但其共性是——不再使用某個(gè)對(duì)象時(shí),釋放動(dòng)態(tài)內(nèi)存的方法是一樣,因此還需要添加一個(gè)node_cleanup()函數(shù),這是通過(guò)free()實(shí)現(xiàn)的,詳見程序清單 4.15。

程序清單 4.15 表達(dá)式算術(shù)樹的接口(CalcTree1.h)

實(shí)現(xiàn)表達(dá)式算術(shù)樹的第一步是輸入數(shù)據(jù)和初始化NumNode結(jié)構(gòu)體的變量isa和_num,newNumNode()函數(shù)原型如下:

其調(diào)用形式如下:

接下來(lái)開始為計(jì)算做準(zhǔn)備,node_calc()函數(shù)原型如下:

其調(diào)用形式如下:

然后開始進(jìn)行加法運(yùn)算,newAddNode()函數(shù)原型如下:

其調(diào)用形式如下:

當(dāng)然,也可以開始進(jìn)行乘法運(yùn)算了,newMultNode()函數(shù)原型如下:

其調(diào)用形式如下:

一切準(zhǔn)備就緒,則計(jì)算最終結(jié)果并釋放不再使用的資源,node_cleanup()函數(shù)原型如下:

其調(diào)用形式如下:

4、實(shí)現(xiàn)接口

顯然,為每個(gè)結(jié)點(diǎn)創(chuàng)建了相應(yīng)的類后,就可以為每個(gè)結(jié)點(diǎn)創(chuàng)建一個(gè)動(dòng)態(tài)變量,即可在運(yùn)行時(shí)根據(jù)需要使用malloc()分配內(nèi)存并使用指針存儲(chǔ)該地址,并使用指針初始化結(jié)構(gòu)體的各個(gè)成員,CalcTree1.c接口的實(shí)現(xiàn)詳見程序清單 4.16。

程序清單 4.16表達(dá)式算術(shù)樹接口的實(shí)現(xiàn)(CalcTree1.c)

>>> 4.4.3 虛函數(shù)

雖然可以使用繼承實(shí)現(xiàn)表達(dá)式算術(shù)樹,但實(shí)現(xiàn)代碼中的每個(gè)對(duì)象都有函數(shù)指針。如果結(jié)構(gòu)體內(nèi)有很多函數(shù)指針,或必須生成更多的對(duì)象時(shí),將會(huì)出現(xiàn)多個(gè)對(duì)象具有相同的行為、需要較多的函數(shù)指針和需要生成較多數(shù)量的對(duì)象,將會(huì)浪費(fèi)很多的內(nèi)存。

不妨將Node中的成員轉(zhuǎn)移到另一個(gè)結(jié)構(gòu)體中實(shí)現(xiàn)一個(gè)虛函數(shù)表,然后在接口中創(chuàng)建一個(gè)抽象數(shù)據(jù)類型NodeVTable,在此基礎(chǔ)上定義一個(gè)指向該表的指針vtable。比如:

表達(dá)式算術(shù)樹的接口詳見程序清單 4.17,其中的NumNode派生于Node,_num表示數(shù)值;BinNode也是派生于Node,pLeft和pRight分別表示指向左子樹和右子樹的指針;而AddNode和MultNode又派生于BinNode。雖然抽象類包含一個(gè)或多個(gè)純虛函數(shù)類,但不能實(shí)例化(此類沒(méi)有對(duì)象可創(chuàng)建),只有從一個(gè)抽象類派生的類和為所有純虛函數(shù)提供了實(shí)現(xiàn)代碼的類才能實(shí)例化,它們都必須提供自己的計(jì)算方法node_calc和node_cleanup。

程序清單 4.17 表達(dá)式算術(shù)樹接口(CalcTree2.h)

顯然,為每個(gè)結(jié)點(diǎn)創(chuàng)建了相應(yīng)的類后,就可以為每個(gè)結(jié)點(diǎn)創(chuàng)建一個(gè)動(dòng)態(tài)變量,即可在運(yùn)行時(shí)根據(jù)需要使用malloc()分配內(nèi)存并使用指針存儲(chǔ)該地址,并使用指針初始化結(jié)構(gòu)體的各個(gè)成員,表達(dá)式算術(shù)樹接口的實(shí)現(xiàn)詳見程序清單 4.18。

程序清單 4.18 表達(dá)式算術(shù)樹接口的實(shí)現(xiàn)(CalcTree2.c)


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 周立功
    +關(guān)注

    關(guān)注

    38

    文章

    130

    瀏覽量

    37763
  • 虛函數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    8

    瀏覽量

    1716

原文標(biāo)題:周立功:深入理解虛函數(shù)

文章出處:【微信號(hào):ZLG_zhiyuan,微信公眾號(hào):ZLG致遠(yuǎn)電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Python的面向對(duì)象編程詳解

    一般編程可分為面向過(guò)程編程,和面向對(duì)象編程。Python的
    發(fā)表于 09-04 16:35 ?595次閱讀
    Python的<b class='flag-5'>面向</b><b class='flag-5'>對(duì)象</b><b class='flag-5'>編程</b>詳解

    labview面向對(duì)象編程

    點(diǎn)擊學(xué)習(xí)>>《龍哥手把手教你學(xué)LabVIEW視覺(jué)設(shè)計(jì)》視頻教程使用LabVIEW面向對(duì)象編程方法,對(duì)于大型測(cè)試應(yīng)用程序來(lái)講,面向對(duì)象相對(duì)于
    發(fā)表于 11-24 11:01

    如何用C語(yǔ)言實(shí)現(xiàn)面向對(duì)象編程

    、組合、多態(tài)等面向對(duì)象的功能,但C語(yǔ)言有struct和函數(shù)指針。我們可以用struct中的數(shù)據(jù)和函數(shù)指針,以此來(lái)模擬對(duì)象和類的行為。所以在正
    發(fā)表于 07-12 07:24

    面向對(duì)象編程及其三大特性 精選資料分享

    編程語(yǔ)言分為面向過(guò)程編程、函數(shù)編程面向對(duì)象
    發(fā)表于 07-21 08:38

    基于面向對(duì)象的LabVIEW編程有哪些優(yōu)勢(shì)

    基于面向對(duì)象的LabVIEW編程有哪些優(yōu)勢(shì)?如何去學(xué)習(xí)基于面向對(duì)象的LabVIEW編程?
    發(fā)表于 08-24 07:22

    談?wù)?b class='flag-5'>面向對(duì)象編程

    在工業(yè)自動(dòng)化領(lǐng)域,梯形圖邏輯仍然是最常用的編程語(yǔ)言之一,但對(duì)于更加復(fù)雜的控制對(duì)象面向對(duì)象編程不失為一種高效率的方式。下面先來(lái)談?wù)?/div>
    發(fā)表于 09-08 07:47

    面向對(duì)象編程語(yǔ)言的特點(diǎn)

    在工業(yè)自動(dòng)化領(lǐng)域,梯形圖邏輯仍然是最常用的編程語(yǔ)言之一,但對(duì)于更加復(fù)雜的控制對(duì)象面向對(duì)象編程不失為一種高效率的方式。下面先來(lái)談?wù)?/div>
    發(fā)表于 09-08 07:44

    面向對(duì)象編程介紹

    目錄一、面向對(duì)象編程介紹1.面向過(guò)程編程2.函數(shù)編程
    發(fā)表于 12-13 07:22

    面向對(duì)象編程練習(xí)

    實(shí)驗(yàn) 3 面向對(duì)象編程練習(xí) 一、實(shí)驗(yàn)?zāi)康?    通過(guò)編程和上機(jī)實(shí)驗(yàn)理解 Java 語(yǔ)言是如何體現(xiàn)面向
    發(fā)表于 09-23 18:57 ?3068次閱讀

    plc面向對(duì)象編程架構(gòu)與實(shí)現(xiàn)

    面向對(duì)象編程是計(jì)算機(jī)高級(jí)語(yǔ)言的一種先進(jìn)的編程模式,在工業(yè)控制系統(tǒng)的PLC程序中也可以采用這種設(shè)計(jì)思想,雖然我們無(wú)法實(shí)現(xiàn)面向
    發(fā)表于 01-31 15:00 ?4302次閱讀
    plc<b class='flag-5'>面向</b><b class='flag-5'>對(duì)象</b><b class='flag-5'>編程</b>架構(gòu)與實(shí)現(xiàn)

    史上最全Python面向對(duì)象編程的資料合集

    面向對(duì)象編程函數(shù)編程面向過(guò)程編程)都是程序設(shè)計(jì)
    的頭像 發(fā)表于 03-30 10:11 ?3242次閱讀

    一文詳解函數(shù)及其相關(guān)知識(shí)點(diǎn)

    )模板類、成員模板、函數(shù); (8)抽象類、接口類、聚合類; 析構(gòu)函數(shù) 析構(gòu)函數(shù)是為了解決基
    的頭像 發(fā)表于 10-13 10:14 ?8007次閱讀

    函數(shù),C++開發(fā)者如何有效利用

    函數(shù)是基類中聲明的成員函數(shù),且使用者期望在派生類中將其重新定義。那么,在 C++ 中,什么是函數(shù)呢?在 C++ 中,通常將
    的頭像 發(fā)表于 02-11 09:39 ?989次閱讀

    深度解析C++中的函數(shù)

    函數(shù)作為C++的重要特性,讓人又愛又怕,愛它功能強(qiáng)大,但又怕駕馭不好,讓它反咬一口,今天我們用CPU的角度,撕掉語(yǔ)法的偽裝,重新認(rèn)識(shí)一下函數(shù)。
    的頭像 發(fā)表于 02-15 11:14 ?883次閱讀
    深度解析C++中的<b class='flag-5'>虛</b><b class='flag-5'>函數(shù)</b>

    西門子PLC面向對(duì)象編程

    面向對(duì)象編程是計(jì)算機(jī)高級(jí)語(yǔ)言的一種高級(jí)編程模式,這種設(shè)計(jì)思想也可以應(yīng)用于工業(yè)控制系統(tǒng)的plc程序中。雖然我們 無(wú)法實(shí)現(xiàn)面向
    發(fā)表于 04-17 11:41 ?7次下載
    西門子PLC<b class='flag-5'>面向</b><b class='flag-5'>對(duì)象</b><b class='flag-5'>編程</b>