天天看點

C++ 繼承性 多态性 整理

一、繼承性

  • 通路控制
    1. public  公有繼承 。基類中public 對應 派生類的public ,基類中protected對應 派生類的protected
    2. protected 保護繼承。基類中public 和 protected 變為派生類的protected
    3. private 私有繼承。基類中public 和 protected 變為派生類的private。
    4. PS::任何繼承方式都不能直接通路基類的private成員。
    5. PS::省略通路描述符 預設為私有繼承。

代碼格式:

class A{
    
}

class C{

}

class B:public A{

}//單繼承

class D:public A,public C{

}//多繼承
           
  • 虛繼承
class A{
    
}

class C{

}

class B:virtual public A{

}//虛繼承

           

二、虛函數

1.注意事項

  • 基類使用virtual 聲明了函數,派生類最好也聲明(可以不聲明,但是為以後着想) ,派生類一直保持虛特性
  • 必須為成員函數。不能使用全局函數,靜态成員函數作為虛函數(因為虛函數要依靠this指針實作)
  • 是以友元函數也不能作為虛函數,但是虛函數可以為另一個類的友元。
  • 析構函數可以是虛函數(最好這樣幹),構造函數就不行了

2.重載特性

  • 函數名,傳回類型(不同,錯誤重載),參數個數、類型和順序完全相同(不同,丢失虛特性)

三、純虛函數

1.概念。在基類中沒有實作定義,要求派生類必須定義自己的版本

形式如下:

virtual 類型 函數名(參數表)=0;
           

2.抽象類

抽象類至少具有一個純虛函數。其派生類成為具體類。

抽象類隻能作為基類;自身不能建立對象(執行個體);不能用做參數類型、函數傳回型或者顯式類型轉換。

但是說明抽象類的指針或者引用。

四、多态性

多态(Polymorphism)按字面的意思就是“多種狀态”。在面向對象語言中,接口的多種不同的實作方式即為多态。引用Charlie Calverts對多态的描述——多态性是允許你将父對象設定成為和一個或更多的他的子對象相等的技術,指派之後,父對象就可以根據目前指派給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:允許将子類類型的指針指派給父類類型的指針。其實我看到過一句話:調用同名函數卻會因上下文的不同而有不同的實作。我覺得這樣更加貼切,還加入了多态三要素:(1)相同函數名  (2)依據上下文  (3)實作卻不同  引用于https://www.cnblogs.com/dormant/p/5223215.html

随筆筆記:

基類的私有資料成員不能在派生類中直接通路,但派生類對象建立私有資料空間

C++ 繼承性 多态性 整理
C++ 繼承性 多态性 整理
C++ 繼承性 多态性 整理

多繼承的派生類構造和通路

Ø 多個基類的派生類構造函數可以用初始式調用基類構造函數初始化資料成員。

Ø執行順序與單繼承構造函數情況類似。多個直接基類構造函數執行順序取決于定義派生類時指定的各個繼承基類的順序。

Ø 一個派生類對象擁有多個直接或間接基類的成員。不同名成員通路不會出現二義性。如果不同的基類有同名成員,派生類對象通路時應該加以識别。

C++ 繼承性 多态性 整理
C++ 繼承性 多态性 整理

Ø 繼承是面向對象程式設計實作軟體重用的重要方法。程式員可以在已有基類的基礎上定義新的派生類。

Ø 單繼承的派生類隻有一個基類。多繼承的派生類有多個基類。

Ø 派生類對基類成員的通路由繼承方式和成員性質決定。

Ø 建立派生類對象時,先調用基類構造函數初始化派生類中的基類成員。調用析構函數的次序和調用構造函數的次序相反。

Ø C++提供虛繼承機制,防止類繼承關系中成員通路的二義性。

 多繼承提供了軟體重用的強大功能,也增加了程式的複雜性