1. 程式人生 > >c+-----------------------------抽象類

c+-----------------------------抽象類

C++抽象類
一、純虛擬函式定義.
純虛擬函式是在基類中宣告的虛擬函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛擬函式的方法是在函式原型後加“=0”

二、引入原因:
1、為了方便使用多型特性,我們常常需要在基類中定義虛擬函式。
2、在很多情況下,基類本身生成物件是不合情理的。例如,動物作為一個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。
為了解決上述問題,引入了純虛擬函式的概念,將函式定義為純虛擬函式(方法:virtual ReturnType Function()= 0;),則編譯器要求在派生類中必須予以過載以實現多型性。同時含有純虛擬函式的類稱為抽象類,它不能生成物件。這樣就很好地解決了上述兩個問題。

三、相似概念:
1、多型性
指相同物件收到不同訊息或不同物件收到相同訊息時產生不同的實現動作。C++支援兩種多型性:編譯時多型性,執行時多型性。
a.編譯時多型性: 通過函式過載和運算子過載來實現的。
b 執行時多型性:通過繼承和虛擬函式來實現的。
2、虛擬函式
虛擬函式是在基類中被宣告為virtual,並在派生類中重新定義的成員函式,可實現成員函式的動態過載
純虛擬函式的宣告有著特殊的語法格式:virtual 返回值型別成員函式名(引數表)=0;

請注意,純虛擬函式應該只有宣告,沒有具體的定義,即使給出了純虛擬函式的定義也會被編譯器忽略。

3、抽象類

 包含純虛擬函式的類稱為抽象類。由於抽象類包含了沒有定義的純虛擬函式,所以不能定義抽象類的物件。
 在C++中,我們可以把只能用於被繼承而不能直接建立物件的類設定為抽象類(Abstract Class)。

     之所以要存在抽象類,最主要是因為它具有不確定因素。我們把那些類中的確存在,但是在父類中無法確定具體實現的成員函式稱為純虛擬函式。純虛擬函式是一種     特殊的虛擬函式,它只有宣告,沒有具體的定義。抽象類中至少存在一個純虛擬函式;存在純虛擬函式的類一定是抽象類。存在純虛擬函式是成為抽象類的充要條件。
     ***抽象類的規定

*(1)抽象類只能用作其他類的基類,不能建立抽象類物件。
(2)抽象類不能用作引數型別、函式返回型別或顯式轉換的型別*


(3)可以定義指向抽象類的指標和引用,此指標可以指向它的派生類,進而實現多型性。
程式舉例:*


 //基類:
class A
{
 public:
    A();
     void f1();
    virtual void f2();
     virtual void f3()=0;
    virtual ~A();
 };

 //子類:
 class B : public A
 {
 public:
     B();
    void f1();
    void f2();
     void f3();
     virtual ~B();
 };

//主函式:
int main(int argc, char* argv[])
 {
    A *m_j=new B();
    m_j->f1();
    m_j->f2();
    m_j->f3();
    delete m_j;
     return 0;
 }
 /*
 f1()是一個普通的過載.
 呼叫m_j->f1();會去呼叫A類中的f1(),它是在我們寫好程式碼的時候就會定好的.因為f1()不是虛擬函式,不會動態繫結
 也就是根據它是由A類定義的,這樣就呼叫這個類的函式.
 f2()是虛擬函式.
 呼叫m_j->f2();會呼叫m_j中儲存的物件中,對應的這個函式.這是由於new的B物件.
 f3()與f2()一樣,只是在基類中不需要寫函式實現.
 */

相關推薦

C# 抽象抽象方法

tail 出現 keyword bstr pos term string enter net 首先,在學習抽象方法的時候,我們必須清楚在C#中為什麽會存在抽象方法,或者說為什麽需要抽象方法。 我們知道,接口可以包含方法的申明和屬性,但是方法中不包含代碼,實現這個接口的方

C++語言學習(十五)——C++抽象與接口

eight close send 都是 () 實例 amp 定義類 esp C++語言學習(十五)——C++抽象類與接口 一、抽象類與接口 1、抽象類簡介 面向對象的抽象類用於表示現實世界的抽象概念,是一種只能定義類型,不能產生對象的類(不能實例化),只能被繼承並被重寫相關

24.C++- 抽象(存虛函數)、接口、多重繼承

通過 https virtual eache 類的成員 似的 什麽 lan 們的 什麽是抽象類 用來表示現實世界中的抽象概念 是一種只能定義類型,而不能產生對象的類 只能被子類繼承,且抽象類的相關成員函數沒有完整的體現,用來被子類重寫. 比如圖形(Shape)類, 就是

c# 抽象抽象方法使用(abstract)

  入行一年多,在這個IT行業,開發技術主要使用的是.NET,而對應使用的高階語言自然就是c#了。從2017年7月入職後,在平時的工作過程中,只記得使用一些方法去完成邏輯功能,而很少去深究一些語法特性,特別是沒有去關注為什麼會去使用這些語法。現在,入職一家新公司,那就從現在開始,一有空就做一些學習記錄,同時這

C#抽象/虛方法

多型:讓一個物件能夠表現出多種狀態(型別) 實現多型的三種手段:1.虛方法 2.抽象類 3.介面 抽象類定義:當父類中的方法不知道如何去實現的時候,可以考慮將父類寫成抽象類,將方法寫成抽象方法. 關鍵字:abstract public abstract class

C#抽象抽象方法

解釋:如果一個類不與具體的事物相聯絡,而只是表達一種抽象的概念,僅僅是作為其派生類的一個基類,這樣的類就是抽象類,在抽象類中宣告方法時,如果加上abstract時就是抽象方法。用法:如果一個類設計的目點是用來被其它類繼承的,它代表一類物件的所具有的公共屬性或方法,那個這個類就

C# 抽象和密閉方法

抽象類abstract: 1.抽象類只存在一個目的就是被繼承;2.抽象類不能夠例項化,只能夠被繼承;3.抽象類可以包含抽象成員和普通成員,以及他們的任意組合;4.抽象類的抽象成員在派生類中需要使用override關鍵字實現。 using System; using System.Collection

[收集]c++抽象、純虛擬函式以及巧用純虛解構函式實現介面

在Java、C#中有關鍵詞abstract指明抽象函式、抽象類,但是在C++中沒有這個關鍵詞,很顯然,在C++也會需要只需要在基類宣告某函式的情況,而不需要寫具體的實現,那C++中是如何實現這一功能的,答案是純虛擬函式。 含有純虛擬函式的類是抽象類,不能生成物件,只能派生。

c+-----------------------------抽象

C++抽象類 一、純虛擬函式定義. 純虛擬函式是在基類中宣告的虛擬函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛擬函式的方法是在函式原型後加“=0”

關於C++抽象建立物件的問題

 抽象類是無法建立物件、但可以定義指標、該指標可以指向它的派生類,進而實現多型性,也可以通過引用。 class A{ public:     virtual int getA() = 0; }; class B : public A { public:    virtual

C# 抽象、密封

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T

c++抽象概念

#include "Englishman.h" #include "Chinese.h" int main(int argc, char **argv) {Englishman e;Chinese c;e.setName("Bill");c.setName("zhangsa

C#抽象

所有 連接 con string 彌補 合並 void 標準 抽象 一、繼承 什麽是繼承:繼承是允許重用現有類去創建新類的過程。分類的原則是一個類派生出來的子類具有這個類的所有非私有的屬性。1、繼承C#中的類:C#不支持多重繼承,C#類始終繼承自一個基類(如果未在聲明中指

C# 抽象抽象方法

必須 override pre pac ole ride ret 派生 bstr using System; namespace 抽象類與抽象方法 { class Program { static void Main(str

C# 接口與抽象

虛方法 聲明 bsp 抽象類 抽象 類繼承 strac 應該 str (1)抽象類使用abstract關鍵字進行定義,接口使用interface關鍵字定義,他們都不能進行實例化。 (2)抽象類中可以包含虛方法、非抽象方法、靜態成員;接口中不能包括虛方法、任何靜態成員 並

C#.NET裏面抽象和接口有什麽區別

end 吃飯 動物 虛方法 根據 自定義 private this sse 1.面向接口編程和面向對象編程是什麽關系 首先,面向接口編程和面向對象編程並不是平級的,它並不是比面向對象編程更先進的一種獨立的編程思想,而是附屬於面向對象思想體系,屬於其一部分。或者說,

C# 接口和抽象的區別

多繼承 構造函數 狀態 簽名 模式 抽象方法 回調 修飾符 什麽 這個問題基本上可以說是 面試時的必問問題 C# 中的接口和抽象類 相同點: 1. 都不能直接實例化,都可以通過繼承實現其抽象方法 2. 都是面向抽象編程的技術基礎,實現了諸多的設計模式 不同點: 1

【轉】C#中的兩把雙刃劍:抽象和接口

實例 可維護 對象 為什麽不使用 程序 一定的 代碼 方式 索引 轉:http://www.cnblogs.com/djzxjblogs/p/7587735.html 第一次面試的時候, 面試官問我,抽象類和接口的區別。 本人也是,按照面試寶典上的回答,說了一大堆。

C#.NET常見問題(FAQ)-abstract抽象如何理解

建築 信息 wal -a 架構師 大型 更多 接口 robot 例如有太多相似,但是不一樣的類,他們都繼承自同一個基類(比如大型遊戲有各個種族,每個種族有各種人物,加起來幾百種類型,然後基本上他們都是一個角色,都有基本相同的屬性和方法,比如都會走,只是速度不同,都有血量,都

4.6 C++抽象和純虛成員函數

中新 error isp ... 先來 必須 pub 對象 c++ 參考:http://www.weixueyuan.net/view/6376.html 總結:   在C++中,可以通過抽象基類來實現公共接口   純虛成員函數沒有函數體,只有函數聲明,在純虛函數聲明結尾加