[C++程式語言設計筆記一]物件導向編程抽象,繼承,重寫基本介紹

來源:互聯網
上載者:User
    今天是個不錯的日子,不僅有人收了我做徒弟從此傳授我有關C++的一些知識,由於前一段時間喜歡上了外掛的研究也用到了一些MFC的知識及一些Windows APIs編程,但是對C++還是沒有從根本上認識。我從來沒有過一個真正意義上的電腦老師(那些只會拿著課件給我念的不算),由於一路走來都只有我一個人,身邊的人也全是學習科研的,美其名曰:生物工程,我想考過大學的人都知道這個科目的熱度有多大---全國十大騙人專業之首。我放棄了我的專業的所有,一頭投向電腦中,這可能也是由於我在高中就開始玩“駭客技術”以及我對電腦的敬仰之情所致。說了這麼多,都是要感謝這位師傅,而且還是個女生,雖然我們是在網路上認識.....前一段時間看了《Windows核心編程》沒有深入瞭解,誰都知道一本比較好的書沒看個幾遍是很難懂得他的精髓的,和我學習.NET一樣(我看了紅皮人頭書WROX出版的《.NET入門經典》總共四遍,第一遍不知道說什麼;第二編好像是這樣;第三遍基本上懂一點;第四遍他才真正把我從VB中給帶到C#過來而一發不可自拔,其實中間版本也有更替了現在應該是第4版了吧<懷疑中>)。今天師傅就推薦了一本《C++程式語言設計》今晚下班回來我就慢慢的讀起,C++之父的著作應該不錯,從今後的一些文章中我會記錄一些我對C++的理解,我要把他從0開始的學期。開了他的寫作方法不愧為一代大師,看的很爽很容易把我帶入狀態。
   
    C++中有標頭檔和實現檔案共同來完成一個類或其他的方法,更術語一點是一個是聲明,一個是定義,聲明是讓人能夠在不同的程式頁面或不同的DLL之間知道你到底有多少東西,這裡也可以這樣解釋你到底想讓人知道多少;而定義是你聲明的函數(方法)是怎樣完成一件事情的,也就是方法的實現。在《C++程式語言設計》中舉了個堆棧的例子,例如我們在Stack.h中聲明了一個類,而在Stack.cpp中實現了這個類的方法(當然要include標頭檔),當我們在其他頁面中要用到Stack類時就要引用到Stack.h檔案,如所示:

    下面我們來看看Stack.h的定義:

class Stack
{
public:
    Stack(int s);
    ~Stack(void);

private:
    const int max_size;
    char* v;
    int top = 0;

public:
    void push(char c);
    char pop();
    class Overflow{};//異常
    class Underflow{};//異常
    class BadSize{};//異常
};

    下面是實現Stack.h的Stack.cpp的定義:

 1 #include "Stack.h"
 2 
 3 Stack::Stack(int s)
 4 {
 5     top = 0;
 6     if(s < 0 || s > 10000)
 7         throw BadSize();
 8 
 9     max_size = s;
10     v = new char[s];
11 }
12 
13 Stack::~Stack(void)
14 {
15     delete[] v;
16 }
17 
18 Stack::push(char c)
19 {
20     if(top == max_size)
21         throw Overflow();
22         
23     v[top] = c;
24     top++;
25 }
26 
27 Stack::pop()
28 {
29     if(top = 0)
30         throw Underflow();
31     top--;
32     return v[top];
33 }


    從上面我們就可以看出了怎樣定義一個類,這個只是堆棧的一種,可能不同類型的堆棧他們的push和pop的方法實現的不一樣,這樣我們為了能夠提供給多個類型使用物件導向的特性“繼承”。把Stack類定義為一個抽象類別型,而實現抽象類別型中的方法的不同類型也稱為多態類型。我們需要藉助關鍵字virtual來聲明,例如我們只要把上面的push和pop方法的聲明改成如下所示:

    virtual void push(char c)=0;
    virtual char pop()=0;

    從上面我們可以看到聲明後帶著“=0”這個表示在繼承的子類中必須重寫此方法[如果你熟悉C#的話,我覺得這就是抽象abstract]。當然當我們應用到其他函數中是可以聲明一個引用變數如下所示:

void f(Stack& s);

 
    這樣將繼承的子類執行個體引用到f的參數中就可以實現了[C#和這個很像,也許C#就是從這邊接過來的東西,我是.NET的開發人員對此也比較熟悉就不多說了]。當我們子類繼承基類時具有幾個存取權限,通常我們使用的都是public關於這個我們在以後還會碰到這裡就不多說了,要繼承一個基類,必須包含基類的標頭檔,並在聲明類的時候通過":"來實現繼承如:ListStack:public Stack,子類的實現方式和其他一樣。

    看大師的書真的很爽,不知不覺被他引入了。慢慢的由淺入深一個一個概念孕育而生,今天理解了這些東東我想也應該完成任務了,OK關電腦睡覺!再次謝謝師傅的推薦!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.