C++的中抽象

來源:互聯網
上載者:User

在C++中,以類、虛函數等為代表的資料抽象功能一直是C++的核心和痛點。這裡我想結合自己的使用經驗,談談對C++中抽象的一點淺薄看法!

我認為C++的抽象應該是指:從我們需要解決的問題出發,在與該問題相關的一組關聯對象中提取出主要的或共有的部分――說簡單一點,就是用相同的行為來操作不同的對象。

從提出問題到找出與該問題相關的對象,這是一個互動的、反覆的過程。在對相關對象的抽象中,隨著認識的深入,我們可能會修改最初的目標,而最初目標的修改又可能使一組新的相關對象被加入進來。如:假設現在要設計一個基於廣域網路的郵件伺服器,首先可能需要通過socket對底層協議進行封裝,為高層的pop3、smtp協議提供一組標準的介面。開始為了使問題簡化我們可能計劃只封裝TCP/IP協議,不過基於以下兩點我們有理由修改最初的需求:

1、pop3、smtp需要的底層介面很簡單。除了串連,僅需要發送、接收一塊資料的功能

2、用socket進行網路編程,大多數常見協議間的差別很小,有許多都僅僅只是初始化和串連不同而已我們只需要做很小的努力就可以相容大多數常用協議(如:ATM、Ipx、紅外線協議等)。

現在決定修改需求,除了TCP/IP協議,還要支援一些其他的的常用協議。通過對最初目標的修改,除了TCP/IP協議對象,又會有一組相關的協議對象被加入進來。我們可以很容易從這組相關對象中提出共有的部分,將他抽象到另一個公用對象中。當然,根據具體應用環境不同,這可能並不是最佳方案。

C++中常規的抽象是在一組相互間有“血緣”關係的類中展開的。如:

Class Parent
{
virtual ~Parent(){};
virtual void GetValue(){ .... };
virtual void Test(){ ... };
};
class child1 : public parent
{
virtual ~child1(){};
virtual void GetValue(){...};
virtual void Test(){ ... } const;
};
class child2 : public parent
{
virtual ~child2(){};
virtual void GetValue(){...};
virtual void Test(){ ... } ;
};

(順便說一句,child1::Test() const 不是基類 parent::Test() 的重載。)

由上可總結出C++中抽象的一些基本特點:

1、被抽象對象必須直接或間接派生至某個類對象

2、如果你不用沒有型別安全的操作,如:向下轉型操作或強制類型轉化操作(像COM那樣)。那麼衍生類別中需要抽象的動作必須在某個基類中出現。

3、基類的解構函式必須是一個虛函數(嗯.... 有點無賴!)

................

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.