日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入浅出之抽象与非抽象

發(fā)布時間:2024/9/27 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入浅出之抽象与非抽象 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、虛函數(shù)&純需函數(shù)

虛函數(shù)?是在基類中使用關(guān)鍵字?virtual?聲明的函數(shù)。在派生類中重新定義基類中定義的虛函數(shù)時,會告訴編譯器不要靜態(tài)鏈接到該函數(shù)。

我們想要的是在程序中任意點可以根據(jù)所調(diào)用的對象類型來選擇調(diào)用的函數(shù),這種操作被稱為動態(tài)鏈接,或后期綁定。

class Shape {protected:int width, height;public:Shape( int a=0, int b=0){width = a;height = b;}virtual int area(){cout << "Parent class area :" <<endl;return 0;} };

純虛函數(shù)

您可能想要在基類中定義虛函數(shù),以便在派生類中重新定義該函數(shù)更好地適用于對象,但是您在基類中又不能對虛函數(shù)給出有意義的實現(xiàn),這個時候就會用到純虛函數(shù)。

virtual 返回值類型成員函數(shù)名(參數(shù)表)=0;

class Shape {protected:int width, height;public:Shape( int a=0, int b=0){width = a;height = b;}// pure virtual functionvirtual int area() = 0; };

= 0 告訴編譯器,函數(shù)沒有主體,上面的虛函數(shù)是純虛函數(shù)。

虛函數(shù)和純虛函數(shù)有以下所示方面的區(qū)別。

(1)類里如果聲明了虛函數(shù),這個函數(shù)是實現(xiàn)的,哪怕是空實現(xiàn),它的作用就是為了能讓這個函數(shù)在它的子類里面可以被覆蓋,這樣的話,這樣編譯器就可以使用后期綁定來達到多態(tài)了。純虛函數(shù)只是一個接口,是個函數(shù)的聲明而已,它要留到子類里去實現(xiàn)。
(2)虛函數(shù)在子類里面也可以不重載的;但純虛函數(shù)必須在子類去實現(xiàn),這就像Java的接口一樣。通常把很多函數(shù)加上virtual,是一個好的習慣,雖然犧牲了一些性能,但是增加了面向?qū)ο蟮亩鄳B(tài)性,因為很難預料到父類里面的這個函數(shù)不在子類里面不去修改它的實現(xiàn)。
(4)帶純虛函數(shù)的類叫虛基類,這種基類不能直接生成對象,而只有被繼承,并重寫其虛函數(shù)后,才能使用。這樣的類也叫抽象類。抽象類和大家口頭常說的虛基類還是有區(qū)別的,在C#中用abstract定義抽象類,而在C++中有抽象類的概念,但是沒有這個關(guān)鍵字。抽象類被繼承后,子類可以繼續(xù)是抽象類,也可以是普通類。

?二、抽象類

? ? ?包含純虛函數(shù)的類稱為抽象類。由于抽象類包含了沒有定義的純虛函數(shù),所以不能定義抽象類的對象。
? ? ?在C++中,我們可以把只能用于被繼承而不能直接創(chuàng)建對象的類設(shè)置為抽象類(Abstract Class)。

? ? ?帶有純虛函數(shù)的類稱為抽象類。抽象類是一種特殊的類,它是為了抽象和設(shè)計的目的而建立的,它處于繼承層次結(jié)構(gòu)的較上層。抽象類是不能定義對象的,在實際中為了強調(diào)一個類是抽象類,可將該類的構(gòu)造函數(shù)說明為保護的訪問控制權(quán)限。

??? 抽象類的主要作用是將有關(guān)的組織在一個繼承層次結(jié)構(gòu)中,由它來為它們提供一個公共的根,相關(guān)的子類是從這個根派生出來的。

??? 抽象類刻畫了一組子類的操作接口的通用語義,這些語義也傳給子類。一般而言,抽象類只描述這組子類共同的操作接口,而完整的實現(xiàn)留給子類。

??? 抽象類只能作為基類來使用,其純虛函數(shù)的實現(xiàn)由派生類給出。如果派生類沒有重新定義純虛函數(shù),而派生類只是繼承基類的純虛函數(shù),則這個派生類仍然還是一個 抽象類。如果派生類中給出了基類純虛函數(shù)的實現(xiàn),則該派生類就不再是抽象類了,它是一個可以建立對象的具體類了。

抽象類的規(guī)定

(1)抽象類只能用作其他類的基類,不能建立抽象類對象。

(2)抽象類不能用作參數(shù)類型、函數(shù)返回類型或顯式轉(zhuǎn)換的類型。

(3)可以定義指向抽象類的指針和引用,此指針可以指向它的派生類,進而實現(xiàn)多態(tài)性。

class AbstractCalculator { public:virtual int getResult() = 0;virtual void setOperatorNumber(int a, int b) = 0;};//加法計算器類 一個類只做一件事 class PlusCalculator :public AbstractCalculator { public:virtual void setOperatorNumber(int a, int b){this->mA = a;this->mB = b;}virtual int getResult(){return mA + mB;} public:int mA;int mB; };//減法計算器類 class MinuteCalculator :public AbstractCalculator { public:virtual void setOperatorNumber(int a, int b){this->mA = a;this->mB = b;}virtual int getResult(){return mA - mB;} public:int mA;int mB; };//乘法計算器類 class MultiplyCalculator :public AbstractCalculator { public:virtual void setOperatorNumber(int a, int b){this->mA = a;this->mB = b;}virtual int getResult(){return mA * mB;} public:int mA;int mB; };int main(void) {AbstractCalculator* caculator = new PlusCalculator;calculator->setOperatorNumber(10, 20);cout << calculator->getResult() << endl;delete calculator;return 0; }

如果定義如下是錯誤的

AbstractCalculator* caculator = new AbstractCalculator; //錯誤

三、抽象類與非抽象類?

抽象類與非抽象類的區(qū)別:

1、抽象類可以被繼承但不能被實例化(可以引用子類實例化對象),子類繼承自抽象類后必須實現(xiàn)該類的所有抽象方法;

2、抽象類中可以有抽象方法和非抽象方法,非抽象類不能有抽象方法,抽象方法一定要被子類重寫,而其他方法沒要求。

四、抽象類與接口

接口描述了類的行為和功能,而不需要完成類的特定實現(xiàn)。

C++ 接口是使用抽象類來實現(xiàn)的,抽象類與數(shù)據(jù)抽象互不混淆,數(shù)據(jù)抽象是一個把實現(xiàn)細節(jié)與相關(guān)的數(shù)據(jù)分離開的概念。

如果類中至少有一個函數(shù)被聲明為純虛函數(shù),則這個類就是抽象類。純虛函數(shù)是通過在聲明中使用 "= 0" 來指定的,如下所示:

class Box {public:// 純虛函數(shù)virtual double getVolume() = 0;private:double length; // 長度double breadth; // 寬度double height; // 高度 };

抽象類和接口的區(qū)別:

1、抽象類中可以有實現(xiàn)成員(非抽象方法),而接口中的方法只有聲明沒有實現(xiàn);

2、抽象類中可以有字段,接口中不能有字段,但可以有屬性;

3、抽象類的成員可以使用公有或其他修飾符,接口中成員是隱式公有的,不需要修飾;

4、抽象類是概念的抽象,接口注重行為,抽象類不支持多重繼承,而一個類可以實現(xiàn)多個接口。

五、抽象方法

抽象方法,這種方法只聲明返回的數(shù)據(jù)類型,方法名稱和所需要的參數(shù),沒有方法體,也就是說抽象方法只需要聲明而不需要事先,當一個方法為抽象方法時,意味著這個方法必須被子類的方法所重寫,否則其子類的該方法仍然是abstract的,而這個子類也必須是抽象的,即聲明為abstract。

?

參考

  • C++ 抽象類
  • C#中抽象類和接口
  • 抽象類和抽象方法總結(jié)
  • 總結(jié)

    以上是生活随笔為你收集整理的深入浅出之抽象与非抽象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 影音先锋二区 | 国产色综合天天综合网 | 国产一区视频在线播放 | 在线观看污视频网站 | 亚洲小说专区 | 精品一区二区三区免费观看 | 丁香花免费高清完整在线播放 | 精品国产va久久久久久久 | 欧美老少做受xxxx高潮 | 五月天激情综合网 | 在线午夜 | 国产福利电影在线 | 欧美人与野 | 大又大粗又爽又黄少妇毛片 | 国内福利视频 | 欧美精品videos另类 | 亚洲欧美日韩第一页 | 色就是色综合 | 性xxxxbbbb| 国产精品久久久久久免费观看 | 精品人妻一区二区三区视频 | 最近日韩中文字幕 | 久久免费看少妇高潮v片特黄 | 老熟妇仑乱视频一区二区 | 99九九视频 | 91丨国产丨捆绑调教 | 成人片网址 | 四季av一区二区三区免费观看 | 九九热九九爱 | 久久成年网| 综合国产一区 | 久草视频精品在线 | 久久av资源网 | 美女网站黄频 | 国产精品一区在线免费观看 | 中国女人内谢69xxxxⅹ视频 | 男人的天堂视频网站 | 国产一区二区精华 | 午夜影院免费体验区 | 名人明星三级videos | 国产av一区精品 | 开心激情综合 | 91一级片| 欧美成人免费网站 | 人人干天天操 | 高潮毛片又色又爽免费 | 都市激情亚洲色图 | 91丨porny丨国产入口 | 草草影院在线播放 | 黑人巨大精品欧美一区二区蜜桃 | 经典一区二区 | 国产鲁鲁| 国产巨乳在线观看 | 免费观看的av | 色成人综合 | 欧美偷拍少妇精品一区 | 日日夜夜国产 | 天堂中文资源在线观看 | 蜜桃91麻豆精品一二三区 | 超碰人人擦| 中文字幕av一区二区三区 | 黄色aa视频| 亚洲日本中文字幕在线 | 亚洲va视频 | 看个毛片| 亚洲成人xxx | 国产精品12页 | 久草福利视频 | 成年人视频在线免费观看 | 久久高清国产 | 国产chinesehd精品 | 午夜亚洲福利在线老司机 | 成人亚洲一区 | 一级成人毛片 | 中文字幕日韩经典 | 国产精品久久网 | 国产精品久久91 | 亚洲色图国产视频 | 无码国产精品久久一区免费 | 欧美激情久久久久 | 久久青青草视频 | 91社区在线播放 | 成年人免费网站 | 亚洲男人在线天堂 | 人妻 丝袜美腿 中文字幕 | 亚洲成人一区二区三区 | 日韩人妻无码精品综合区 | 国产日韩精品在线观看 | 国产欧美亚洲一区 | 后进极品美女白嫩翘臀 | 欧美性生活一区 | 亚洲成人av在线播放 | 欧美三级又粗又硬 | 天躁夜夜躁狼狠躁 | 狠狠涩| 亚洲午夜无码久久 | 欧美黑人狂野猛交老妇 | 久久免费在线观看视频 | 99精品一区二区三区无码吞精 |