C++基礎④多態,模板,異常

接續上篇C++基礎③new對象,繼承,友元函數,函數的可變參數

前言

在學Java的時候 , 我們會接觸到面向對象的三大特征,封裝,繼承,多態 。而Java是從C++里面脫胎出來的,所以也具有這些特征 , 在上篇中 , 介紹了繼承,友元函數等 , 今天來學習一下多態 。我相信大家對多態并不陌生 , C++中的多態和Java類似,只是實現起來有些差別 。說明一下:基礎篇只是對語言語法的簡單介紹, 并不會深入語言機制,將C++與Java的不同之處點出 , 所以相對比較枯燥 , 各位看官也可僅僅有個印象即可,再在用到的時候,就有跡可尋。

多態

C++的多態用法和Java類似 , 只是需要虛函數的支撐。

Meat.h

// 父類 .h
#pragma once

/*肉類*/

class Meat {
    
public:
    // 使用虛函數 , 實現多態
    virtual void getName();
};

Meat.cpp

#include "Meat.h"
#include <iostream>

using namespace std;

void Meat::getName() {

    cout << "我是肉類 -- super class" << endl;

}

父類將要被復寫的函數需要virtual表示 , 虛函數才具有之類復寫的特性。

Fish.h

#pragma once

/*
    魚肉 繼承 肉類
*/

#include "Meat.h"

class Fish : public Meat {

public:
    virtual void getName();
};

Fish.cpp


#include "Fish.h"
#include <iostream>

using namespace std;

void Fish::getName() {

    cout << "我是魚肉。。。" << endl;
}

Chicken.h

#pragma once

/*
    雞肉 繼承 肉類
*/

#include "Meat.h"

class Chicken : public Meat{

public:
    virtual void getName();

};

Chicken.cpp

#include "Chicken.h"
#include <iostream>

using namespace std;

void Chicken::getName() {

    cout << "我是雞肉。。。" << endl;

}

C++多態作用與用法和Java差不多

void printMeatInfo(Meat &m) {
    m.getName();
}

/*使用多態*/
void usePolymorphism() {

    Chicken c;
    Fish f;

    printMeatInfo(c);
    printMeatInfo(f);
}

函數的對象參數使用引用傳遞,可以減少對象的的臨時生成,加大對內存空間的利用率。多態要在用的時候才會真正體會到他的便捷 , 在C++中配合純抽象類使用更佳 。

模板

C++中有模板函數還有模板類,類似于Java的泛型,在邏輯計算中,無需關心數據的具體類型 。在Java中,我們最常用的泛型救數List, 例如:List<String> cities = new ArrayList();下面,我們來看看C++的模板函數。

/*
    模板函數 根據實際類型,自動推導
*/
template<typename T>
void anySwap(T &t1,T &t2) {
    T tmp = NULL;
    tmp = t1; 
    t1 = t2;
    t2 = tmp;
}

/*使用模板函數*/
void useTemplateFunc() {

    int i = 10; 
    int j = 30;

    anySwap(i, j);

    cout << "i = " << i << "   j = " << j << endl;

    cout << " ------- 字符交換 ---------" << endl;

    char* c1 = "思念在蔓延";
    char* c2 = "一通電話在世界兩邊";

    anySwap(c1, c2);

    cout << "c1 = " << c1 << "   c2 = " << c2 << endl;
}

模板函數,在函數之前使用template<typename T>來聲明模板函數,T為自動推導類型。下面,我們用模板,來模擬一下Java的ArrayList類。

/*
    CPP  template class 

    模板類 , 相當于Java的泛型類 , 模擬Java集合類
*/

#include <iostream>

using namespace std;

/*
    使用模板類加上純虛函數模擬Java的Collection接口
*/
template <typename T>
class Collection {

public:
    virtual void add(T t) = 0;
    virtual void del(T t) = 0;
    virtual void change(int index, T t) = 0;
    virtual T*  query() = 0;
};

/*
    模擬Java的ArrayList集合
*/
template <typename T>
class ArrayList : public Collection<T> {
    
public:
    void add(T t) {

    }

    void del(T t) {

    }

    void change(int index, T t) {

    }
    T*  query() {
        return NULL;
    }
};

class templateClassDemo {

public:
    void useTemplateClass() {
        // 在使用的時候指定模板類的類型
        ArrayList<int> a;
        a.add(1);
        cout << "使用CPP模板類, 模擬Java集合類" << endl;
    }

};

C++的模板特性和Java的泛型及其類似,只是寫法上有所區別,萬物都是相通的,變的是外在,不變的是算法核心。

異常

C++的異常比Java的異常處理自由,可以通過隨意的定義數字字符等拋出,然后通過catch函數參數類型去匹配。

    /*CPP 可以拋出任意類型的Exception*/
    void throwStringException() {
        throw "拋出字符類型Exception";
    }

    void throwIntException() {
        throw 1;
    }

    /*捕獲異常*/
    void catchException() {
        try
        {
            throwStringException();
            throwIntException();
        
        }
        catch (char* e)
        {
            cout <<"捕獲String類型的異常信息 : "<< e << endl;
        }
        catch (int e1) {
            cout << "捕獲int類型的異常信息:" << e1 << endl;
        }
    }

自定義異常

/*自定義異常類*/
class CustomException {

public:
    CustomException(char* msg) {
        this->msg = msg;
    }

    char* showMsg() {
        return this->msg;
    }

private:
    char* msg;
};

使用

// use
void throwObjectException() {
        // 不要拋異常指針 , new了對象指針之后必須銷毀 , 并且還會產生對象副本,占內存
        // 還有標準異常處理 , 查看API
        throw CustomException("我是自定義對象異常");
    }

      /*捕獲異常*/
    void catchException() {
        try
        {
            
            throwObjectException();
        }
        catch (CustomException &ex) {
            cout << "捕獲自定義異常:" << ex.showMsg() << endl;
        }
    }

結語

C++基礎系列基本上到此結束了,因其基本語法與C比較像,就沒做過多介紹,基本上只做了面向對象部分的介紹。

C++基礎系列,斷斷續續,今天總算是可以告一段落了 , 上個月由于一些事情停更了一段時間,日子也沒以前那么悠閑了 , 要學的東西如排山倒海般涌來,IT行業的發展是越來越快,要學的也越來越多,大到各種語言學習C/C++ , Java , Python , JavaScript 。小到各種奇淫巧技 , 無所不包 。

語言不是限定 , 沒有哪一個項目只用一種語言可以搞定的,學習語言,不只是學習那門語言的語法,更重要的是那門語言思想 。

后續系列文章計劃

一 , 開始撰寫Android UI系列
二 , 開始不定期撰寫JavaScript系列(基礎)

因其工作及自身原因,NDK實戰項目現在并沒有很多時間撰寫,初步計劃在元月初在家的時候開始逐步更新NDK實戰項目。

路漫漫其修遠兮 , 吾將上下而求索 。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

推薦閱讀更多精彩內容