亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        了解C++的封裝、繼承和多態(tài)

        2019-09-10 07:22:44
        電腦報(bào) 2019年25期
        關(guān)鍵詞:基類子類多態(tài)

        近期重新看了一下C++,一是感覺清晰了許多,二是覺得若是換個(gè)角度看的話,會(huì)有不一樣的體會(huì),并且也容易記住C++中的一些特性。本文就試圖將集合論中的相關(guān)知識(shí)引入到C++的封裝、繼承、多態(tài)上,讓我們對(duì)它有個(gè)新的認(rèn)識(shí)。

        一、封裝

        C語言中,代碼之間的關(guān)系都是函數(shù)式的調(diào)用。這里面牽扯到對(duì)數(shù)據(jù)的操作,若操作的都是局部變量,那一切都太平了。但若是幾個(gè)函數(shù)操作同一個(gè)非局部變量,考慮到模塊化,那么就要將變量和操作變量的函數(shù)整合在一起,這就是C++中的封裝。

        C++里面引入了class的概念,目的是封裝數(shù)據(jù)和數(shù)據(jù)上的操作,使其成為一個(gè)獨(dú)立的模塊。若是將這個(gè)獨(dú)立的模塊(代碼和數(shù)據(jù))想象成集合,那個(gè)class A的集合為:

        此時(shí)若再引入一個(gè)class B,則有下面四種可能性,情況三、四實(shí)際上類似。

        情況一,只需要封裝就足夠了。處理情況二、三、四時(shí),為了考慮代碼共享,需要引入繼承機(jī)制。

        二、繼承

        我們先考慮情況二,由于A和B有公共代碼(成員函數(shù)或者是成員變量),故通??紤]將公共的部分定義為class C,然后由A、B去繼承它。

        對(duì)于情況三、四,我們不需要演變,直接讓A繼承B,或者B繼承A即可。

        若此時(shí)引入class D,那么情況就會(huì)復(fù)雜很多。簡單起見,以情況二為擴(kuò)展,考慮添加class D后的某一種。后續(xù)你會(huì)發(fā)現(xiàn),情況三、四類似。

        此時(shí),最合理的方式是引入四個(gè)類,class E, class F, class G, class H。E為基類,F(xiàn)、G、H為一級(jí)子類、A、B、D為二級(jí)子類。

        但是,這種解決方案有問題:

        1.若是再添加class I,class J,那復(fù)雜度就可想而知了。

        2.雖然代碼冗余是消除了,但是引入了四個(gè)類,也著實(shí)有點(diǎn)多,更嚴(yán)重的話會(huì)導(dǎo)致“類泛濫”。

        為了能統(tǒng)一解決添加的類D,我們將圖四拆分成D和A,以及D和B的關(guān)系。這樣就轉(zhuǎn)化為圖2中的一種:情況二。

        圖6中,class H表示D和A的公共部分,class G表示D和B的公共部分。此種解法雖然有代碼冗余,但簡單了許多,事實(shí)上,我們很多時(shí)候處理類,就是這么處理的。

        在這種情況下,若是添加class I,class J,都可以轉(zhuǎn)化為新添加類和已有類之間的單獨(dú)關(guān)系,即圖2中的四種情況。

        同時(shí),也可以發(fā)現(xiàn),我們無法在類的繼承結(jié)構(gòu)中完全消除代碼冗余,原因是多個(gè)類的情況下,實(shí)在是比較復(fù)雜。

        當(dāng)我們?cè)谑褂眠@些包含繼承結(jié)構(gòu)的類的時(shí)候,考慮圖2的情況三,若B繼承自A,那么實(shí)際上B也可以當(dāng)A用的,這很好理解,本來A就是B的一部分。但若是想讓A代表B呢(實(shí)際上就是B對(duì)象,只是用的時(shí)候當(dāng)A用),為了完美解決這個(gè)問題,就要引入多態(tài)了。

        三、多態(tài)

        由前面的分析可知,類之間的關(guān)系都可以簡化為圖2的情況。圖2的情況三中,A當(dāng)B用(實(shí)際上只有B對(duì)象)又分為以下三種情況。第三種情況有點(diǎn)別扭,可能是需求決定的吧。

        1.使用B中的A部分。直接使用A操作即可。

        2.使用B中的非A部分。需要將A轉(zhuǎn)化為B才可使用。

        3.B覆蓋定義A的公共接口或者成員變量。當(dāng)B作為A使用的時(shí)候,A中的公共接口或者成員變量是在非A中的,實(shí)現(xiàn)這一機(jī)制的就是多態(tài)。

        C++中,基類定義虛函數(shù),子類可以重新實(shí)現(xiàn)它,以實(shí)現(xiàn)多態(tài)。令人奇怪的是,沒有虛成員變量的概念,我覺得可能有以下幾個(gè)原因:

        1.沒必要提供虛成員變量。父類的成員變量屬于存儲(chǔ)空間,可以直接用。不像函數(shù),屬于代碼無法直接替換。

        2.可能編譯器要實(shí)現(xiàn)這個(gè)會(huì)比較復(fù)雜吧。

        3.封裝的概念是少暴露成員變量,只暴露接口。因此,好的類的設(shè)計(jì)是沒有公共的成員變量的,也就不存在虛成員變量一說了。但是,從完整性的角度而言,應(yīng)該提供虛成員變量的。

        猜你喜歡
        基類子類多態(tài)
        分層多態(tài)加權(quán)k/n系統(tǒng)的可用性建模與設(shè)計(jì)優(yōu)化
        基于C#面向?qū)ο蟪绦蛟O(shè)計(jì)的封裝、繼承和多態(tài)分析
        卷入Hohlov算子的某解析雙單葉函數(shù)子類的系數(shù)估計(jì)
        參差多態(tài)而功不唐捐
        關(guān)于對(duì)稱共軛點(diǎn)的倒星象函數(shù)某些子類的系數(shù)估計(jì)
        空戰(zhàn)游戲設(shè)計(jì)實(shí)例
        一種基于用戶興趣的STC改進(jìn)算法
        虛機(jī)制在《面向?qū)ο蟪绦蛟O(shè)計(jì)C++》中的教學(xué)方法研究
        人多巴胺D2基因啟動(dòng)子區(qū)—350A/G多態(tài)位點(diǎn)熒光素酶表達(dá)載體的構(gòu)建與鑒定及活性檢測
        煙堿型乙酰膽堿受體基因多態(tài)與早發(fā)性精神分裂癥的關(guān)聯(lián)研究
        熟妇的荡欲色综合亚洲| 亚洲成熟中老妇女视频| 亚洲一区精品在线中文字幕 | 色偷偷亚洲第一成人综合网址| 丰满女人又爽又紧又丰满| 四虎成人精品国产一区a| 日本一道高清在线一区二区| 97成人精品国语自产拍| 中国丰满熟妇xxxx性| 久久久久亚洲女同一区二区| 日本在线中文字幕一区| 亚洲综合偷自成人网第页色| 久久久久久曰本av免费免费| 福利一区视频| 日韩精品久久不卡中文字幕| 国产乱码一区二区三区精品| 性高湖久久久久久久久| 日韩欧美中文字幕公布| 日韩av中文字幕一卡二卡| 中文字幕人妻饥渴浪妇| 亚洲一区二区三区中文字幂| 亚洲人成人一区二区三区| 亚洲国产精品一区二区| 久久久亚洲欧洲日产国码二区| 中文字幕av无码一区二区三区 | 日韩一区二区三区久久精品| 成人aaa片一区国产精品 | 九九精品国产99精品| 亚洲中文字幕精品久久a| 99久久精品午夜一区二区| 无遮挡亲胸捏胸免费视频| av天堂吧手机版在线观看| 亚洲国产美女高潮久久久| 人妻少妇精品无码专区二区| 国产成人免费一区二区三区| 国产一区二区三区成人av| 国产精品99精品久久免费| 国产一区二区三区美女| 日韩在线中文字幕一区二区三区 | 少妇性bbb搡bbb爽爽爽| 国产精品国语对白露脸在线播放 |